Java IO框架


可從IO的類層次,IO框架的設計模式來論述。

 

總體來說,IO可以分為字節流和字符流,不同在於字符流由字節流包裝而來,在IO讀入之后經過JVM處理,把字節流轉換成字符流。而字符流的字符采用哪種字符編碼實現由JVM默認編碼決定。

而每個流都分輸入和輸出,所以,總體來說,IO有四個頂層類:

InputStream

OutputStream

Reader

Writer

 

而作為機器級別於機器直接交互的則是字節流:

InputStream

OutputStream

 

IO的中間類,進行字節流到字符流的轉換過渡,通常可作為字符流類的構造參數,可指定編碼:

InputStreamReader

OutputStreamWriter

 

而字節流和字符流的緩沖容器來看有bytechar之分,所以派生出:

ByteArrayInputStream

ByteArrayOutputStream

CharArrayInputStream

CharArrayOutputStream

 

以上類只是表示流的表示形式,而在傳輸形式上還表現為是否有緩沖。所以,可以派生出子類為可緩沖類:

BufferInputStream

BufferOutputStream

BufferReader

BufferWriter

 

每一個頂層類都有對目錄文件(File)的支持:

FileInputStream

FileOutputStream

FileReader

FileWriter

 

Java中,一個強大的功能就是可以對對象進行序列化,轉成二進制文件輸出,也就是字節流輸出而不是字符流輸出,所以有頂層的InputStreamOutputStream派生類:

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類對其進行輸入輸出。如:FileObjectStreamClassString

 

Java IO 框架中主要應用了兩個設計模式:裝飾模式和適配器模式。

 

姑且就把Java IO划分為元素和行為兩個部分,元素則是適配,行為則是裝飾加強。

 

適配器模式主要在於字節流到字符流的轉換和元素的包裝上,如類:InputStreamReader, CharArrayReader, FileReader, PipedReader, StringReader

裝飾模式主要在對流的強化之中,如緩沖、過濾、行定位等,如類:BufferedReader, FilterReader, LineNumberReader

 

一個典型的例子就是:

BufferReader br = new BufferReader(new InputStreamReader(System.in));

綜合了兩種模式:把InputStream適配成InputStreamReader,再把InputStreamReader加強裝飾城BufferedReader

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM