緩衝流
到目前為止,我們看到的大多數示例都使用無緩衝的I/O,這意味著每個讀取或寫入請求都由底層作業系統直接處理,這可以使程式效率低得多,因為每個這樣的請求通常觸發磁碟訪問、網路活動或一些相對昂貴的其他操作。
為了減少這種開銷,Java平臺實現了緩衝的I/O流,緩衝輸入流從稱為緩衝區的記憶體區讀取資料,僅當緩衝區為空時才呼叫原生輸入API,類似地,緩衝輸出流將資料寫入緩衝區,並且僅在緩衝區已滿時才呼叫原生輸出API。
程式可以使用我們現在多次使用的包裝習慣用法將無緩衝的流轉換為緩衝流,將無緩衝的流物件傳遞給緩衝流類的建構函式,以下是如何修改CopyCharacters
示例中的建構函式呼叫以使用緩衝I/O:
inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
有四個用於包裝無緩衝流的緩衝流類:BufferedInputStream和BufferedOutputStream建立緩衝的位元組流,而BufferedReader和BufferedWriter建立緩衝的字元流。
沖洗緩衝流
在關鍵點寫出緩衝區通常是有意義的,而不是等待它被填滿,這稱為沖洗緩衝區。
一些緩衝的輸出類支援autoflush
,由可選的建構函式引數指定,啟用autoflush
時,某些關鍵事件會導致沖洗緩衝區。例如,自動沖洗PrintWriter
物件在每次呼叫println
或format
時沖洗緩衝區,有關這些方法的更多資訊,請參閱格式化。
要手動沖洗流,請呼叫其flush
方法,flush
方法在任何輸出流上都有效,但除非流被緩衝,否則無效果。