|
什么是流:
流是一個(gè)抽象的概念。當(dāng)Java程序需要從數(shù)據(jù)源讀取數(shù)據(jù)時(shí),會(huì)開(kāi)啟一個(gè)到數(shù)據(jù)源的流。數(shù)據(jù)源可以是文件,內(nèi)存或者網(wǎng)絡(luò)等。同樣,當(dāng)程序需要輸出數(shù)據(jù)到目的地時(shí)也一樣會(huì)開(kāi)啟一個(gè)流,數(shù)據(jù)目的地也可以是文件、內(nèi)存或者網(wǎng)絡(luò)等。流的創(chuàng)建是為了更方便地處理數(shù)據(jù)的輸入輸出。
流分為字節(jié)流和字符流。字節(jié)流也稱(chēng)為原始數(shù)據(jù),需要用戶(hù)讀入后進(jìn)行相應(yīng)的編碼轉(zhuǎn)換。而字節(jié)流的實(shí)現(xiàn)是基于自動(dòng)轉(zhuǎn)換的,讀取數(shù)據(jù)時(shí)會(huì)把數(shù)據(jù)按照J(rèn)VM的默認(rèn)編碼自動(dòng)轉(zhuǎn)換成字符。
字節(jié)流由InputStream和OutputStream處理,而字符流由Reader和Writer處理。Reader和Writer是Java后加入的處理類(lèi),出于讓數(shù)據(jù)的處理更方便的目的。
字節(jié)流處理概述:
對(duì)于字節(jié)流處理的類(lèi)都繼承自InputStream和OutputStream這兩個(gè)抽象類(lèi)。
InputStream提供的最重要的方法是:
read(); read(byte[] b) ; read(byte[] b, int off, int len) ;
用于從輸入流中讀取字節(jié)。
OutputStream提供的最重要的方法是:
write(int b); write(byte[] b); write(byte[] b, int off, int len) 用于將字節(jié)寫(xiě)入輸出流。
字節(jié)流處理類(lèi)概述:
字節(jié)流的處理類(lèi)有很多,他們都繼承自InputStream或者OutputStream抽象類(lèi)。
輸入流:
先談?wù)勢(shì)斎肓鳎斎肓髦懈鷶?shù)據(jù)源直接接觸的類(lèi)有:FileInputStream和ByteArrayInputStream,他們分別實(shí)現(xiàn)了從文件或者內(nèi)存中的字節(jié)數(shù)組讀入數(shù)據(jù)到輸入流。
其他的輸入流處理類(lèi)都是裝飾類(lèi)(Decorator模式),下面對(duì)他們進(jìn)行一下簡(jiǎn)單介紹:
BufferedInputStream: 提供了緩沖功能。 DataInputStream: 允許應(yīng)用程序以與機(jī)器無(wú)關(guān)方式從底層輸入流中讀取基本 Java 數(shù)據(jù)類(lèi)型。應(yīng)用程序可以使用數(shù)據(jù)輸出流寫(xiě)入稍后由數(shù)據(jù)輸入流讀取的數(shù)據(jù)。 PipedInputStream: 允許以管道的方式來(lái)處理流。當(dāng)連接到一個(gè)PipedOutputStream后,它會(huì)讀取后者輸出到管道的數(shù)據(jù)。 PushbackInputStream: 允許放回已經(jīng)讀取的數(shù)據(jù)。 SequenceInputStream: 能對(duì)多個(gè)inputstream進(jìn)行順序處理。
輸出流:
基本上每個(gè)輸入流類(lèi)都有一個(gè)相應(yīng)的輸出流類(lèi),提供相應(yīng)的輸出流處理。 同樣,跟數(shù)據(jù)目的地直接接觸的類(lèi)有:FileOutputStream和ByteArrayOutputStream,前者實(shí)現(xiàn)了把數(shù)據(jù)流寫(xiě)入文件的功能,后者實(shí)現(xiàn)了一個(gè)輸出流,其中的數(shù)據(jù)被寫(xiě)入一個(gè) byte 數(shù)組。緩沖區(qū)會(huì)隨著數(shù)據(jù)的不斷寫(xiě)入而自動(dòng)增長(zhǎng)。可使用
下面對(duì)其它的裝飾類(lèi)做一下簡(jiǎn)單介紹: BufferedOutputStream: 提供了緩沖功能的輸出流,在寫(xiě)出完成之前要調(diào)用flush來(lái)保證數(shù)據(jù)的輸出。 DataOutputStream: 數(shù)據(jù)輸出流允許應(yīng)用程序以適當(dāng)方式將基本 Java 數(shù)據(jù)類(lèi)型寫(xiě)入輸出流中。然后,應(yīng)用程序可以使用數(shù)據(jù)輸入流將數(shù)據(jù)讀入。 PipedOutputStream: 允許以管道的方式來(lái)處理流。可以將管道輸出流連接到管道輸入流來(lái)創(chuàng)建通信管道。管道輸出流是管道的發(fā)送端。通常,數(shù)據(jù)由某個(gè)線(xiàn)程寫(xiě)入 PrintStream: 為其他輸出流添加了功能,使它們能夠方便地打印各種數(shù)據(jù)值表示形式。我們經(jīng)常用到的System.out或者System.err都是PrintStream。
字符流處理概述:
所有的字符流操作類(lèi)都繼承自Reader或者Writer這兩個(gè)抽象類(lèi)。
Reader提供的重要方法有:
read(char[] cbuf); read(char[] cbuf, int off, int len); read(CharBuffer target);
他們提供了從流中讀取數(shù)據(jù)到字符數(shù)組或者CharBuffer的功能。
Writer提供的重要方法有:
write(char[] cbuf); write(char[] cbuf, int off, int len); write(int c); write(String str); write(String str, int off, int len);
他們提供了把字符、字符數(shù)組或者字符串寫(xiě)入流中的功能。
字符流處理類(lèi)概述:
輸入流:
跟數(shù)據(jù)源直接接觸的類(lèi): CharArrayReader: 從內(nèi)存中的字符數(shù)組中讀入數(shù)據(jù),以對(duì)數(shù)據(jù)進(jìn)行流式讀取。 StringReader:從內(nèi)存中的字符串讀入數(shù)據(jù),以對(duì)數(shù)據(jù)進(jìn)行流式讀取。 FileReader:從文件中讀入數(shù)據(jù)。注意這里讀入數(shù)據(jù)時(shí)會(huì)根據(jù)JVM的默認(rèn)編碼對(duì)數(shù)據(jù)進(jìn)行內(nèi)轉(zhuǎn)換,而不能指定使用的編碼。所以當(dāng)文件使用的編碼不是JVM默認(rèn)編碼時(shí),不要使用這種方式。要正確地轉(zhuǎn)碼,使用InputStreamReader。
裝飾類(lèi): BufferedReader:提供緩沖功能,可以讀取行:readLine(); LineNumberReader: 提供讀取行的控制:getLineNumber()等方法。 InputStreamReader: 字節(jié)流通向字符流的橋梁:它使用指定的
輸出流:
根數(shù)據(jù)目的相關(guān)的類(lèi): CharArrayWriter:把內(nèi)存中的字符數(shù)組寫(xiě)入輸出流,輸出流的緩沖區(qū)會(huì)自動(dòng)增加大小。輸出流的數(shù)據(jù)可以通過(guò)一些方法重新獲取。 StringWriter: 一個(gè)字符流,可以用其回收在字符串緩沖區(qū)中的輸出來(lái)構(gòu)造字符串。 FileWriter:把數(shù)據(jù)寫(xiě)入文件。
裝飾類(lèi): BufferedWriter:提供緩沖功能。 OutputStreamWriter:字符流通向字節(jié)流的橋梁:可使用指定的 PrintWriter: 向文本輸出流打印對(duì)象的格式化表示形式。
流處理中的其它方法:
mark和reset用于重復(fù)讀取某段的數(shù)據(jù),如下代碼:
is = new BufferedInputStream(new FileInputStream("res/input.data"));
assertTrue(is.available() > 0);
assertTrue(is.markSupported());
// The read limit has no effect.
is.mark(0);
int first = is.read();
int second = is.read();
is.reset();
int firstAgain = is.read();
int secondAgain = is.read();
assertEquals(first, firstAgain);
assertEquals(second, secondAgain);
Writer或者OutputStream中的flush(): 刷新該流的緩沖,用于確保數(shù)據(jù)的輸出。
close(): 關(guān)閉流并釋放與之關(guān)聯(lián)的所有系統(tǒng)資源。 |
|
|