“你好,阿米戈!今天艾莉跟你說的是適配器模式。”

大多數與 I/O 流相關的類都是作為適配器實現的。他們要么轉換等效接口,要么將它們連接起來,從簡單的開始,向上移動到復雜的。

InputStreamReaderBufferedReader也是適配器嗎?最起碼,它們在使用方式上與適配器非常相似:創建一個對像後,將其傳遞給另一個類的構造函數。”

“是的,InputStreamReader將InputStream接口轉換為Reader接口。BufferedReader不是最純粹形式的適配器,因為 Java 的創建者決定不為其方法提供自己的單獨接口。但它是一種同類精神。”

Java 的創建者沒有編寫大量不同的類,而是編寫了兩打適配器,並允許它們以程序員可能想要的方式相互連接。

這種方法非常方便。程序員總是可以編寫她的類和/或適配器,讓它實現一個標準接口,並將其包含在她正在構建的適配器對象鏈中。

“這就是它的工作原理。我們製作簡單對象和適配器的鏈,而不是大的複雜類。然後你只需創建它們並按正確的順序組合它們!”

“你實施任何缺失的東西。”

“好了,我懂了。”

“但其實我今天想給大家講的是ReaderWriter。這是兩個抽像類,和InputStream和OutputStream類非常相似。但是與那些類不同的是,這兩個類是處理字符的。它們讀取和寫入字符。它們是在處理文本信息時非常方便。讓我們看看它們的方法:“

讀者方法 該方法的作用
int read(char[] cbuf);
“此方法立即將幾個字符讀入緩衝區字符數組),直到緩衝區已滿或源沒有更多字符可供讀取。”
該方法返回實際讀取的字符數(可以小於數組長度)
int read();
“此方法讀取一個字符並返回它。結果被擴展為一個 int 以供查找。如果沒有可用字符,則該方法返回 -1。”
boolean ready();
如果讀取方法有任何未讀字符,則此方法返回 true
void close();
此方法“關閉”流。當你完成流的工作時,你會調用它。
然後該對象執行關閉文件等所需的內務處理操作。
此時,您不能再從流中讀取任何數據。

“事實證明,Reader 的read(char [] cbuf)方法讓我們可以讀取整塊字符,而不是一次讀取一個字符。因此它更快、更方便。”

“沒錯。現在讓我們看看 Writer 有哪些方法:”

方法 該方法的作用
void write(int c);
此方法寫入一個字符。int 類型縮小為 char。多餘的部分被簡單地丟棄。
void write(char[] cbuff);
此方法寫入一個字符數組。
void write(String s);
此方法寫入一個字符串。它只是簡單地轉換為一個字符數組,然後調用第二個方法。
void flush();
如果流在內部存儲任何尚未寫入的數據,則此方法會強制將其寫入。
void close();
此方法“關閉”流。當你完成流的工作時,你會調用它。
然後該對象執行關閉文件等所需的內務處理操作。您不能再向流中寫入數據,系統會自動調用 flush。

了解ReaderWriter是抽像類很重要。它們什麼都不做,幾乎不包含任何代碼。它們的所有方法都需要在繼承它們的類中實現。他們的工作是標準化類之間的交互方式。開發人員不需要發明自己的標準來相互交互。大家維護幾個基本標準就方便多了。這使得不同程序員編寫的類不僅可以輕鬆地與 Java 創建者編寫的類交互,還可以與其他程序員編寫的類輕鬆交互。

標準是強大的。

“我同意。支持共同標準對每個人都有好處。”