java常用流總結

一咖为、先看下必備知識:

1秕狰,流:系統(tǒng)內部和外部進行數據傳輸的管道。

2躁染,內部:內存鸣哀;外部:輸入設備,文件吞彤,網絡我衬。

3叹放,輸入(讀)通過輸入流對象,從外把數據傳送到內部挠羔。

4井仰,輸出(寫),從內到外破加,通過輸出流對象俱恶,把內存數據傳送到外部(網絡,文件范舀,顯示器控制臺)合是。

5,文本文件:

以ASCII碼方式存放的文件锭环,一般一個英文字符一個字節(jié)(以字節(jié)為單位)端仰,.txt某種意義上顯示器和鍵盤也叫文本文件。

如果想看見文件的內容田藐,這個文件必須以文本方式存放荔烧,所以顯示器也是文本文件,與內存存放方式(二進制)unicode碼不一樣汽久,將文件輸入內存鹤竭,使用需要轉換。

缺點:文本文件如果處理需要轉換景醇,效率低

6臀稚,二進制文件:

以內存方式存放,內部怎么用外部怎么存三痰,不可見吧寺,不能通過外部設備輸入

優(yōu)點:處理不需要轉換,效率高散劫,使用容易稚机。

//***

流:嚴格意義上只有一種,就是字節(jié)流获搏,jdk1.2版本增加了字符流赖条,其實也是字節(jié)流的變體。

字節(jié)流傳輸太慢常熙,又有過濾流(BufferedStream,DataStream,ObjectStream對象流)來套接纬乍,也叫套接流,假設字節(jié)流是個小管子裸卫,那么過濾流就是大管子仿贬,把大管子套接在小管子上,將字節(jié)流作為這些流的參數墓贿。另外茧泪,標準字節(jié)輸入輸出流(System.out/in/array)退个;還有管道流(PipedStream),經常用于線程之間调炬;順序輸入流(SequenceStream),將小管子接在一起成為長管子舱馅,等等缰泡,這些也全是字節(jié)流,內存流很少使用代嗤。

二棘钞、常用流

1、字節(jié)流

字節(jié)流是一個抽象類干毅,不是接口宜猜,因為輸入字節(jié)流的read()方法沒實現,輸出字節(jié)流的write()方法沒實現硝逢。不管是什么字節(jié)流姨拥,字節(jié)流的基類是inputStream OutputStream。

(1)inputStream 的一些常用方法:

對read做重載(三個)渠鸽,

int read();//從輸入流中讀一個字節(jié)叫乌,形成一個0~255之間的整數返回(是一個抽象方法)。

int read(byte b[]);//從流中讀取若干個字節(jié)的數據徽缚,存放到字節(jié)數組中憨奸,用于struts文件的上傳

int read(byte b[],int off,int len);//從輸入的字節(jié)流讀取lenth個字節(jié),從offset開始,放到字節(jié)數組中

close();//關閉

(2)OutputStream的一些常用方法:

對write做重載(三個)凿试,

write(int b);//將一個整數最低字節(jié)數據輸出到流中,

write(byte b[])//把內存的字節(jié)數組里的數據依次輸出到流所指向的文件

write(byte b[],int off ,int length)//將數組b中從off指定的位置開始排宰,長度為len的數據輸出到流中;

flush();//刷空輸出流,并將緩沖區(qū)中的數據強制送;一定要刷空那婉。

close();//關閉

2板甘、文件字節(jié)流

(1)文件字節(jié)流創(chuàng)建出輸入流和輸出流對象,

(2)文件輸入和輸出只作文本文件详炬,以順序操作虾啦,并且區(qū)分輸入流和輸出流。

import java.io.*;

class Filestream

{

public static void main(String args[])

{

try

{

File inFile=new File("file1.txt");

File outFile=new File("file2.txt");

//創(chuàng)建出輸入流和輸出流對象痕寓,

FileInputStream fis=new FileInputStream(inFile);

FileOutputStream fos=new ?FileOutputStream(outFile);

int c;

while((c=fis.read())!=-1) ?fos.write(c);

fis.close();//關閉

fos.close();

}catch(FileNotFoundException e) {

System.out.println("FileStreamsTest: "+e);

}catch(IOException e) {

System.err.println("FileStreamsTest: "+e);

}

}

}

3傲醉、隨機流

(1)類RandomAccessFile允許對文件內容同時完成讀和寫操作,它直接繼承object呻率,并且同時實現了接口DataInput和DataOutput硬毕,提供了支持隨機文件操作的方法:

(2)不區(qū)分輸入流輸出流,對文件訪問一定要指定訪問方式礼仗,(rw)可以隨機訪問文件某一位置的字符,可以以二進制的方式對數據進行存儲,可以隨機調整文件位置指針吐咳,隨機輸出逻悠。

(3)經典面試例子

import java.io.*;

public class random_file

{

public static void main(String args[])

{

int[] data_arr = {12,31,56,23,27,1,43,65,4,99};

try

{

RandomAccessFile randf = new RandomAccessFile("temp.dat","rw");

for (int i = 0; i < data_arr.length; i++)

randf.writeInt(data_arr[i]);

for(int i=data_arr.length-1; i>=0; i--)

{

randf.seek(i*4);

System.out.println(randf.readInt());//倒敘輸出

}

randf.seek(8);//跳8個字節(jié)輸出結果

System.out.println(randf.readInt());//56

System.out.println(randf.readInt());//23

randf.skipBytes(8);

System.out.println(randf.readInt());//43

randf.close();

}catch (IOException e){

System.out.println("File access error: "+e);

}

}

}

4、過濾流

(1)BufferStream

BufferInputStream和BufferOutputStream必須套接在字節(jié)流上韭脊,順序讀韧恕;

Buffer流是過濾流沪羔,不能單獨使用饥伊,并且區(qū)分輸入流和輸出流;

只能處理文本文件蔫饰,不能一次讀一行琅豆,一次能讀取若干字節(jié)的字符,沒有做本質的改變篓吁;

import java.io.*;

public class BufferedStreamDemo{

public static void main(String[] args){

try{

FileInputStream in = new FileInputStream(".//data1.txt");

BufferedInputStream fin = new BufferedInputStream(in);

FileOutputStream out = new FileOutputStream(".//data2.txt");

BufferedOutputStream fout = new BufferedOutputStream(out);

byte[] buf = new byte[512];

int c = 0;

while((c = fin.read(buf, 0, 512)) != -1){

System.out.println("c = " + c);

fout.write(buf, 0, c);

}

fin.close();

fout.close();

}catch(FileNotFoundException e){

System.out.println("File Not Found!");

}catch(IOException e){

System.out.println("I/O Error!");

}

}

}

(2)DataStream

Data流也是套接流茫因,一定要套接在字節(jié)流上,區(qū)分輸入輸出

DataInputStream

DataOutputStream

既可以套接文件字節(jié)流杖剪,也可以套接在網絡上(很多)

(1)套接在文件流上

(2)可以一次讀取一行的字符

(3)可以對漢字做編碼

(4)不僅處理文本文件冻押,也可以處理二進制文件

import java.io.*;

public class datainput_output

{

public static void main(String args[])throws IOException

{

FileOutputStream fos = new FileOutputStream("a.txt");

DataOutputStream dos = new DataOutputStream (fos);

try

{

dos.writeBoolean(true);

dos.writeByte((byte)123);

dos.writeChar('J');

dos.writeDouble(3.141592654);

dos.writeFloat(2.7182f);

dos.writeInt(1234567890);

dos.writeLong(998877665544332211L);

dos.writeShort((short)11223);

}

finally

{

dos.close();

}

FileInputStream ?fis = new FileInputStream("a.txt");

DataInputStream dis = new DataInputStream(fis);

try

{

System.out.println("\t "+dis.readBoolean());

System.out.println("\t "+dis.readByte());

System.out.println("\t "+dis.readChar());

System.out.println("\t "+dis.readDouble());

System.out.println("\t "+dis.readFloat());

System.out.println("\t "+dis.readInt());

System.out.println("\t "+dis.readLong());

System.out.println("\t "+dis.readShort());

}

finally

{

dis.close();

}

}

}

(3)ObjectStream

也是過濾流,只處理二進制文件盛嘿,不能處理文本文件

序列化:(串行化):把自己的狀態(tài)(屬性值)放在對象輸出流中傳送就叫翼雀。。

1孩擂,這個類一定要加入串行化協(xié)議String類和封裝類就加入了串行化協(xié)議狼渊。

2,創(chuàng)建出類的對象类垦,new Student()狈邑,為類的實例全局變量賦值。

3蚤认,創(chuàng)建對象輸出流米苹,先創(chuàng)建字節(jié)流,再套接在對象流上砰琢。

4蘸嘶,對象輸出流對象的writeObject()方法,寫進流中陪汽。

public class Student implements Serializable//串行化協(xié)議

{

int id;

String name;

int age;

String department;

public Student(int id, String name, int age, String department)

{

this.id = id;

this.name = name;

this.age = age;

this.department = departmernt;

}

}

反序列化:

通過文件對象輸入流讀取對象的狀態(tài)训唱,再生出對象。

1挚冤,創(chuàng)建對象輸入流對象况增,先創(chuàng)建文件輸入流對象。

2训挡,從對象所指文件讀取對象的狀態(tài)澳骤,readObject()再生成對象object造型為student歧强。

3,串行化加反串行化叫做對象的持續(xù)性为肮。

對象的串行化只保存對象的屬性(狀態(tài))摊册。

瞬時的狀態(tài)也不可保存,用transient標注颊艳,這時對象屬性不能傳送茅特。

public class Objectser

{

public static void main(String args[])

{

Student stu = new Student(981036,“Li Ming”, 16,“CSD”);

try

{

FileOutputStream fo = new FileOutputStream(“data.ser”);

ObjectOutputStream so = new ObjectOutputStream(fo);

so.writeObject(stu);

so.close();

}

catch(Exception e)

{

System.out.println(e) ;

}

}

}

5、管道流PipedStream

分管道輸入流和輸出流 籽暇,在線程中傳數據,生產者消費者模式與這個相結合饭庞。

import java.io.*;

/**

*管道流和生產者消費者相結合

*@TestPipePC測試管道流和線程結合類

*@Wang Cy 2016/0803

*/

public class TestPipePC

{

public static void main(String[] args)

{

//創(chuàng)建管道輸出流

PipedInputStream pis = ?new PipedInputStream();

//創(chuàng)建管道輸出流

try{

PipedOutputStream pos = new PipedOutputStream(pis);

//生產者線程

Producer p = new Producer(pos);

//創(chuàng)建消費者線程

Consumer c = new Consumer(pis);

//激活線程

p.start();

c.start();

}catch(IOException e){

System.out.println(e);

}

//管道流是不是無法實現三個或以上的線程通信

}

}

//生產者線程

class Producer extends Thread

{

private PipedOutputStream pos;

public Producer(PipedOutputStream pos)

{

this.pos = pos;

}

public void run()

{

int i = 0;

try {

while(i<10)

{

this.sleep(1000);

pos.write(i);

System.out.println("生產者:"+i);

i++;

}

} catch (IOException e) {

e.printStackTrace();

} catch(InterruptedException e2){

e2.printStackTrace();

}

}

}

//消費者線程

class Consumer extends Thread

{

private PipedInputStream pis;

public Consumer(PipedInputStream pis)

{

this.pis = pis;

}

public void run()

{

try

{

while(true)

{

System.out.println("消費者:"+pis.read());

}

} catch (IOException e1) {

}

}

}

6戒悠、順序輸入流SequenceStream

只對文件字節(jié)輸入流做鏈接

import java.io.*;

public class SequenceStream

{

public static void main(String args[])

{

try

{

FileInputStream f1,f2;

String s;

f1 = new FileInputStream("file1.txt");

f2 = new FileInputStream("data1.txt");

SequenceInputStream fs = new SequenceInputStream(f1, f2);//對兩個輸入流做連接

DataInputStream ds = new DataInputStream(fs);

while( (s = ds.readLine()) != null )

System.out.println(s);

f1.close();

f2.close();

}catch(FileNotFoundException e) {

System.out.println("FileStreamsTest: "+e);

}catch(IOException e) {

System.err.println("FileStreamsTest: "+e);

}

}

}

7、PrintStream標準流

被system繼承舟山,加載主方法時绸狐,通過system創(chuàng)建3個對象,in,out,err

8累盗、字符流

字符流不能讀取二進制文件寒矿,只能處理文本文件。

import java.io.*;

public class FileTOUnicode

{

public static void main(String args[])

{

try

{

FileInputStream fis = new FileInputStream("file1.txt");

InputStreamReader dis = new InputStreamReader(fis);

// InputStreamReader dis = new InputStreamReader(System.in);

BufferedReader reader = new BufferedReader(dis);

String s;

while( (s = reader.readLine()) != null )

{

System.out.println("read: "+s);

}

dis.close();

}catch(IOException e)

{

System.out.println(e);

}

}

}

?"?????u?vB??

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末若债,一起剝皮案震驚了整個濱河市符相,隨后出現的幾起案子,更是在濱河造成了極大的恐慌蠢琳,老刑警劉巖啊终,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異傲须,居然都是意外死亡蓝牲,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門泰讽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來例衍,“玉大人,你說我怎么就攤上這事已卸》鹦” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵累澡,是天一觀的道長翎嫡。 經常有香客問我,道長永乌,這世上最難降的妖魔是什么惑申? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任具伍,我火速辦了婚禮,結果婚禮上圈驼,老公的妹妹穿的比我還像新娘人芽。我一直安慰自己,他們只是感情好绩脆,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布萤厅。 她就那樣靜靜地躺著,像睡著了一般靴迫。 火紅的嫁衣襯著肌膚如雪惕味。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天玉锌,我揣著相機與錄音名挥,去河邊找鬼。 笑死主守,一個胖子當著我的面吹牛禀倔,可吹牛的內容都是我干的。 我是一名探鬼主播参淫,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼救湖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了涎才?” 一聲冷哼從身側響起鞋既,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耍铜,沒想到半個月后涛救,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡业扒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年检吆,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片程储。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹭沛,死狀恐怖,靈堂內的尸體忽然破棺而出章鲤,到底是詐尸還是另有隱情摊灭,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布败徊,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏煤杀。R本人自食惡果不足惜眷蜈,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一沈自、第九天 我趴在偏房一處隱蔽的房頂上張望枯途。 院中可真熱鬧忌怎,春花似錦、人聲如沸酪夷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晚岭。三九已至鸥印,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腥例,已是汗流浹背辅甥。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工酝润, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留燎竖,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓要销,卻偏偏與公主長得像构回,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疏咐,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法纤掸,類相關的語法,內部類的語法浑塞,繼承相關的語法借跪,異常的語法,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • 一酌壕、流的概念和作用掏愁。 流是一種有順序的,有起點和終點的字節(jié)集合卵牍,是對數據傳輸的總成或抽象果港。即數據在兩設備之間的傳輸...
    布魯斯不吐絲閱讀 10,018評論 2 95
  • 【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子糊昙,小兔子長到第三個月后每個月又生一對兔...
    葉總韓閱讀 5,126評論 0 41
  • 1 IO(三)No20 1.1Properties 屬性集 【 Properties屬性集辛掠,主要用于操作配置屬...
    征程_Journey閱讀 887評論 0 1
  • server { listen 8888; server_name localhost; #charset ...
    喬伊斯閱讀 195評論 0 0