http://blog.csdn.net/licl19870605/archive/2010/05/18/5604327.aspx
JAVA IO架構
可從IO的類層次,IO架構的設計模式來論述。
總體來說,IO可以分為位元組流和字元流,不同在於字元流由位元組流封裝而來,在IO讀入之後經過JVM處理,把位元組流轉換成字元流。而字元流的字元採用哪種字元編碼實現由JVM預設編碼決定。
而每個流都分輸入和輸出,所以,總體來說,IO有四個頂層類:
InputStream
OutputStream
Reader
Writer
而作為機器層級於機器直接互動的則是位元組流:
InputStream
OutputStream
以IO的中間類,進行位元組流到字元流的轉換過渡,通常可作為字元流類的構造參數,可指定編碼:
InputStreamReader
OutputStreamWriter
而位元組流和字元流的緩衝容器來看有byte和char之分,所以派生出:
ByteArrayInputStream
ByteArrayOutputStream
CharArrayInputStream
CharArrayOutputStream
以上類只是表示流的表示形式,而在傳輸形式上還表現為是否有緩衝。所以,可以派生出子類為可緩衝類:
BufferInputStream
BufferOutputStream
BufferReader
BufferWriter
每一個頂層類都有對目錄檔案(File)的支援:
FileInputStream
FileOutputStream
FileReader
FileWriter
從整個類架構的結構實現的介面來看,頂層類:
InputStream implements Closable,
OutputStream implements Closable, Flushable
Reader implements Closable, Readable
Writer implements Closable, Flushable, Appendable
各個介面方法:
Closable: close();
Flushable: flush();
Readable: read(CharBuffer cb);
Appendable: append();
從IO類使用時的規則來看,實現這些方法就是很自然的了,也是必須要實現的。如:流使用完必須關閉,流輸出前必須重新整理。 注意的是,這四個頂層類都沒有實現Serializable介面。
java.io.Serializable雖然屬於IO架構,但其並不是直接作用於IO架構四個頂層IO類及其子類,而是作用於其它對象,使其可被序列化,再通過IO類對其進行輸入輸出。如:File、ObjectStreamClass、String。
在Java中,一個強大的功能就是可以對對象進行序列化,轉成二進位檔案輸出,也就是位元組流輸出而不是字元流輸出,所以有頂層的InputStream和OutputStream衍生類別:
ObjectInputStream
ObjectOutputStream
流包括了節點流和過濾流,注意的是過濾流,可在讀寫的同時對資料進行操作,並且實現了同步操作,頂層過濾流類:
FilterInputStream
FilterOutputStream
其子類則在其基礎上,對節點流進行封裝,常見子類有:
BufferInputStream BufferOutputStream
DataInputStream DataOutputStream
LineNumberInputStream PrintStream
可參考子類的構造方法。
以上IO操作幾乎就是把流裝載到記憶體中,對其進行操作的時候是順序讀寫,而需要隨機讀寫時:
RandomAccessFile
Java IO 架構中主要應用了兩個設計模式:裝飾模式和適配器模式。
姑且就把Java IO劃分為元素和行為兩個部分,元素則是適配,行為則是裝飾加強。
適配器模式主要在於位元組流到字元流的轉換和元素的封裝上,如類:InputStreamReader, CharArrayReader, FileReader, PipedReader, StringReader。
裝飾模式主要在對流的強化之中,如緩衝、過濾、行定位等,如類:BufferedReader, FilterReader, LineNumberReader。
一個典型的例子就是:
BufferReader br = new BufferReader(new InputStreamReader(System.in));
綜合了兩種模式:把InputStream適配成InputStreamReader,再把InputStreamReader加強裝飾城BufferedReader。