可從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
在Java中,一個強大的功能就是可以對對象進行序列化,轉成二進制文件輸出,也就是字節流輸出而不是字符流輸出,所以有頂層的InputStream和OutputStream派生類:
ObjectInputStream
ObjectOutputStream
流包括了節點流和過濾流,注意的是過濾流,可在讀寫的同時對數據進行操作,並且實現了同步操作,頂層過濾流類:
FilterInputStream
FilterOutputStream
其子類則在其基礎上,對節點流進行封裝,常見子類有:
BufferInputStream BufferOutputStream
DataInputStream DataOutputStream
LineNumberInputStream PrintStream
可參考子類的構造方法。
以上IO操作幾乎就是把流裝載到內存中,對其進行操作的時候是順序讀寫,而需要隨機讀寫時:
RandomAccessFile
從整個類框架的結構實現的接口來看,頂層類:
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 IO 框架中主要應用了兩個設計模式:裝飾模式和適配器模式。
姑且就把Java IO划分為元素和行為兩個部分,元素則是適配,行為則是裝飾加強。
適配器模式主要在於字節流到字符流的轉換和元素的包裝上,如類:InputStreamReader, CharArrayReader, FileReader, PipedReader, StringReader。
裝飾模式主要在對流的強化之中,如緩沖、過濾、行定位等,如類:BufferedReader, FilterReader, LineNumberReader。
一個典型的例子就是:
BufferReader br = new BufferReader(new InputStreamReader(System.in));
綜合了兩種模式:把InputStream適配成InputStreamReader,再把InputStreamReader加強裝飾城BufferedReader。