在Java 1.0中,數據流通過FilterInputStream和FilterOutputStream的“裝飾器”(Decorator)子類適應特定的需求。Java 1.1的IO流沿用了這一思想,但沒有繼續采用所有裝飾器都從相同“filter”(過濾器)基礎類中衍生這一做法。若通過觀察類的層次結構來理解它,這可能令人出現少許的困惑。
在下面這張表格中,對應關系比上一張表要粗糙一些。之所以會出現這個差別,是由類的組織造成的:盡管BufferedOutputStream是FilterOutputStream的一個子類,但是BufferedWriter並不是FilterWriter的子類(對後者來說,盡管它是一個抽象類,但沒有自己的子類或者近似子類的東西,也沒有一個“占位符”可用,所以不必費心地尋找)。然而,兩個類的接口是非常相似的,而且不管在什麼情況下,顯然應該盡可能地使用新版本,而不應考慮舊版本(也就是說,除非在一些類中必須生成一個Stream,不可生成Reader或者Writer)。
Filters:
Java 1.0 class
Corresponding Java 1.1 class
FilterInputStream
FilterReader
FilterOutputStream
FilterWriter (abstract class with no subclasses)
BufferedInputStream
BufferedReader
(also has readLine())
BufferedOutputStream
BufferedWriter
DataInputStream
use DataInputStream
(Except when you need to use readLine(), when you should use a BufferedReader)
PrintStream
PrintWriter
LineNumberInputStream
LineNumberReader
StreamTokenizer
StreamTokenizer
(use constructor that takes a Reader instead)
PushBackInputStream
PushBackReader
過濾器:Java 1.0類 對應的Java 1.1類
FilterInputStream FilterReader
FilterOutputStream FilterWriter(沒有子類的抽象類)
BufferedInputStream BufferedReader(也有readLine())
BufferedOutputStream BufferedWriter
DataInputStream 使用DataInputStream(除非要使用readLine(),那時需要使用一個BufferedReader)
PrintStream PrintWriter
LineNumberInputStream LineNumberReader
StreamTokenizer StreamTokenizer(用構建器取代Reader)
PushBackInputStream PushBackReader
有一條規律是顯然的:若想使用readLine(),就不要再用一個DataInputStream來實現(否則會在編譯期得到一條出錯消息),而應使用一個BufferedReader。但除這種情況以外,DataInputStream仍是Java 1.1 IO庫的“首選”成員。
為了將向PrintWriter的過渡變得更加自然,它提供了能采用任何OutputStream對象的構建器。PrintWriter提供的格式化支持沒有PrintStream那麼多;但接口幾乎是相同的。