- Java核心技術·卷Ⅱ:高級特性(原書第10版)
- (美)凱S.霍斯特曼
- 958字
- 2020-10-30 18:10:37
2.1.2 完整的流家族
與C語言只有單一類型FILE*包打天下不同,Java擁有一個流家族,包含各種輸入/輸出流類型,其數量超過60個!請參見圖2-1和圖2-2。

圖2-1 輸入流與輸出流的層次結構
讓我們把輸入/輸出流家族中的成員按照它們的使用方法來進行劃分,這樣就形成了處理字節和字符的兩個單獨的層次結構。正如所見,InputStream和OutputStream類可以讀寫單個字節或字節數組,這些類構成了圖2-1所示的層次結構的基礎。要想讀寫字符串和數字,就需要功能更強大的子類,例如,DataInputStream和DataOutputStream可以以二進制格式讀寫所有的基本Java類型。最后,還包含了多個很有用的輸入/輸出流,例如,ZipInputStream和ZipOutputStream可以以常見的ZIP壓縮格式讀寫文件。
另一方面,對于Unicode文本,可以使用抽象類Reader和Writer的子類(請參見圖2-2)。Reader和Writer類的基本方法與InputStream和OutputStream中的方法類似。

read方法將返回一個Unicode碼元(一個在0~65535之間的整數),或者在碰到文件結尾時返回-1。write方法在被調用時,需要傳遞一個Unicode碼元(請查看卷Ⅰ第3章有關Unicode碼元的討論)。

圖2-2 Reader和Writer的層次結構
還有4個附加的接口:Closeable、Flushable、Readable和Appendable(請查看圖2-3)。前兩個接口非常簡單,它們分別擁有下面的方法:

和

InputStream、OutputStream、Reader和Writer都實現了Closeable接口。
注意:java.io.Closeable接口擴展了java.lang.AutoCloseable接口。因此,對任何Closeable進行操作時,都可以使用try-with-resource語句(try-with-resource語句是指聲明了一個或多個資源的try語句——譯者注)。為什么要有兩個接口呢?因為Closeable接口的close方法只拋出IOException,而AutoCloseable.close方法可以拋出任何異常。

圖2-3 Closeable、Flushable、Readable和Appendable接口
而OutputStream和Writer還實現了Flushable接口。
Readable接口只有一個方法:

CharBuffer類擁有按順序和隨機地進行讀寫訪問的方法,它表示一個內存中的緩沖區或者一個內存映像的文件(請參見2.6.2節以了解細節)。
Appendable接口有兩個用于添加單個字符和字符序列的方法:

CharSequence接口描述了一個char值序列的基本屬性,String、CharBuffer、StringBuilder和StringBuffer都實現了它。
在流類的家族中,只有Writer實現了Appendable。
java.io.Closeable 5.0
·void close()
關閉這個Closeable,這個方法可能會拋出IOException。
java.io.Flushable 5.0
·void flush()
沖刷這個Flushable。
java.lang.Readable 5.0
·int read(CharBuffer cb)
嘗試著向cb讀入其可持有數量的char值。返回讀入的char值的數量,或者當從這個Readable中無法再獲得更多的值時返回-1。
java.lang.Appendable 5.0
·Appendable append(char c)
·Appendable append(CharSequence cs)
向這個Appendable中追加給定的碼元或者給定的序列中的所有碼元,返回this。
java.lang.CharSequence 1.4
·char charAt(int index)
返回給定索引處的碼元。
·int length()
返回在這個序列中的碼元的數量。
·CharSequence subSequence(int startIndex,int endIndex)
返回由存儲在startIndex到endIndex-1處的所有碼元構成的CharSequence。
·String toString()
返回這個序列中所有碼元構成的字符串。