1、流(Stream)
stream代表的是任何有能力產出數據的數據源,或是任何有能力接收數據的接收源。Java的I/O操作類在java.io包下,這些類可以大概分爲兩類,操作字節流的和操作字符流的類:
- 字節流 表示以字節爲單位從stream中讀取或往stream中寫入信息,即java.io包中的inputstream類和outputstream類的派生類。通常用來讀取二進制數據,如圖象和聲音。
- 字符流 以Unicode字符爲單位從stream中讀取或往stream中寫入信息。
2、字節輸入流
下面來看一下操作字節輸入流的類的框架結構:
由以上的類圖可以看出:
- InputStream是所有的輸入字節流的父類,它是一個抽象類。
- ByteArrayInputStream、StringBufferInputStream、FileInputStream是三種基本的介質流,它們分別從Byte數組、StringBuffer和本地文件中讀取數據。PipedInputStream是從與其它線程共用的管道中讀取數據。
- ObjectInputStream和所有FilterInputStream的子類都是裝飾流。
各個類的詳細的介紹如下:
在FilterInputStream類下還有一些具體的子類,如下圖:
3、字節輸出流
操作字節輸出流的類的框架結構:
可以看到:
- OutputStream是所有的輸出字節流的父類,它是一個抽象類。
- ByteArrayOutputStream、FileOutputStream是兩種基本的介質流,它們分別向Byte數組和本地文件中寫入數據。PipedOutputStream是向與其它線程共用的管道中寫入數據。
- ObjectOutputStream和所有FilterOutputStream的子類都是裝飾流。下表列出了輸出字節流的功能及如何使用它們。
來看一下各個類的具體介紹:
4、字符輸入流
從上圖可以看出:
- Reader是所有的輸入字符流的父類,它是一個抽象類。
- CharReader、StringReader是兩種基本的介質流,它們分別將Char數組、String中讀取數據。PipedReader是從與其它線程共用的管道中讀取數據。
- BufferedReader很明顯就是一個裝飾器,它和其子類負責裝飾其它Reader對象。
- FilterReader是所有自定義具體裝飾流的父類,其子類PushbackReader對Reader對象進行裝飾,會增加一個行號。
- InputStreamReader是一個連接字節流和字符流的橋樑,它將字節流轉變爲字符流。FileReader可以說是一個達到此功能、常用的工具類,在其源代碼中明顯使用了將FileInputStream轉變爲Reader的方法。我們可以從這個類中得到一定的技巧。
5、字符輸出流
在上面的關係圖中可以看出:
- Writer是所有的輸出字符流的父類,它是一個抽象類。
- CharArrayWriter、StringWriter是兩種基本的介質流,它們分別向Char數組、String中寫入數據。PipedWriter是向與其它線程共用的管道中寫入數據,
- BufferedWriter是一個裝飾器爲Writer提供緩衝功能。
- PrintWriter和PrintStream極其類似,功能和使用也非常相似。
- OutputStreamWriter是OutputStream到Writer轉換的橋樑,它的子類FileWriter其實就是一個實現此功能的具體類(具體可以研究一下Source Code)。功能和使用和OutputStream極其類似,後面會有它們的對應圖。
6、字節流與字符流的區別
- Reader和Writer要解決的,最主要的問題就是國際化。原始的I/O類庫只支持8位的字節流,因此不可能很好地處理16位的Unicode字符流。Unicode是國際化的字符集,這樣加了Reader和Writer之後,所有的字節流都可以轉換爲字符流,也就都支持Unicode了。
- 使用字符處理要比字節處理的效率高。實際上字節流在操作時本身不會用到緩衝區(內存),是文件本身直接操作的,而字符流在操作時使用了緩衝區,通過緩衝區再操作文件,如下圖所示。同時緩衝區也增加了操作字符的靈活性,例如可以讀取當前位置的前一個字符等等...
所以說某些情況下,如果一個程序頻繁地操作一個資源(如文件或數據庫),則性能會很低,此時爲了提升性能,就可以將一部分數據暫時讀入到內存的一塊區域之中,以後直接從此區域中讀取數據即可,因爲讀取內存速度會比較快,這樣可以提升程序的性能。
但是,Read和Write並不是取代InputStream和OutputStream,有時,你還必須同時使用"基於byte的類"和"基於字符的類"。爲此,它還提供了兩個"適配器(adapter)"類。InputStreamReader負責將InputStream轉化成Reader,而OutputStreamWriter則將OutputStream轉化成Writer。