java.io包中的類很是繁多,但其實只要歸成4類:InputStream
& OutputStream
、Reader
& Writer
,因爲功能和命名上都至關接近,所以只要掌握了其中一種,將會很容易理解其餘3種。java
橫向歸類:InputStream
& OutputStream
(字節流)、Reader
& Writer
(字符流).
縱向歸類:InputStream
做爲父類,其子類的角色和做用,並以此觸類旁通。api
字節(byte)是計算機中基本數據單位,一切的計算機數據(或「文件」)都是由或多或少的字節組成,所以使用字節流,理論上能夠處理一切計算機數據(文件),包括圖像、音頻、文本等。數組
然而對於文本數據,因爲存在編碼問題比較麻煩,因此交由字符流處理。oracle
1char=2byte,字符(char)的表示範圍(2^16)是字節(byte)表示範圍(2^8)的2^8=256倍。專門用於處理文本數據。dom
字節流在Java的第一版(jdk 1.0)已經存在,字符流在jdk 1.1中加入,以替代字節流中處理字符的功能。性能
私覺得,提到Java I/O的話,不能不提裝飾者模式。ui
裝飾者模式就是在一個主體(被裝飾者)的外部使用裝飾類來進行裝飾,對主體的行爲根據不一樣的裝飾者類進行不一樣的修改。單個的裝飾類自根據自身特色對主體的行爲進行部分改進,所以能夠組合多個裝飾類來對主體進行修改(在代碼中表現爲多層裝飾類的嵌套)。編碼
Java的I/O類設計應用了裝飾者模式。單個的流對象主體,例如InputStream
的直接子類(Direct Subclasses)中,分別面向文件FileInputStream
、內存ByteArrayInputStream
、線程PipedInputStream
,而InputStream
的另外一個直接子類FileterInputStream
爲裝飾類(的父類),分別定義了各類具體的裝飾類(如BufferedInputStream
、DataInputStream
等)。線程
如圖: 設計
從代碼的角度來看:DataInputStream
、BufferedInputStream
爲裝飾者,FileInputStream
爲主體(被裝飾者)
InputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(new File(src))));
裝飾者模式從抽象的角度來講很容易理解,然而也存在一個很明顯的缺點:裝飾類過多。所以咱們能看到java.io包中那麼多的類。若是沒有理解裝飾者模式,即便有必定經驗的Java developer也會感到混亂。
例如對於文件複製這樣的操做來講,即便是文本文件的複製,咱們對其具體的內容是什麼並不關心,所以能夠直接使用字節流。但當咱們要從一個文本文件中讀取內容,咱們關心其具體的內容,因此使用字符流。
篇幅所限,只列出經常使用的類,其他部分可參考Java API手冊。
InputStream
合併成一個;BufferedOutputStream
;本篇做爲Java I/O系列之一,只分析了字節流和字符流。其餘Java I/O內容如File、RandomAccessFile、System類的I/O支持和重定向、字符編碼、文件壓縮、對象序列化和Scanner等內容會在(2/3)中發表。
NIO部分打算在(3/3)中發表。