到目前爲止,咱們看到的大多數示例都使用無緩衝的I/O,這意味着每一個讀取或寫入請求都由底層操做系統直接處理,這能夠使程序效率低得多,由於每一個這樣的請求一般觸發磁盤訪問、網絡活動或一些相對昂貴的其餘操做。html
爲了減小這種開銷,Java平臺實現了緩衝的I/O流,緩衝輸入流從稱爲緩衝區的內存區讀取數據,僅當緩衝區爲空時才調用原生輸入API,相似地,緩衝輸出流將數據寫入緩衝區,而且僅在緩衝區已滿時才調用原生輸出API。java
程序能夠使用咱們如今屢次使用的包裝習慣用法將無緩衝的流轉換爲緩衝流,將無緩衝的流對象傳遞給緩衝流類的構造函數,如下是如何修改CopyCharacters
示例中的構造函數調用以使用緩衝I/O:segmentfault
inputStream = new BufferedReader(new FileReader("xanadu.txt")); outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
有四個用於包裝無緩衝流的緩衝流類:BufferedInputStream和BufferedOutputStream建立緩衝的字節流,而BufferedReader和BufferedWriter建立緩衝的字符流。api
在關鍵點寫出緩衝區一般是有意義的,而不是等待它被填滿,這稱爲沖洗緩衝區。網絡
一些緩衝的輸出類支持autoflush
,由可選的構造函數參數指定,啓用autoflush
時,某些關鍵事件會致使沖洗緩衝區。例如,自動沖洗PrintWriter
對象在每次調用println
或format
時沖洗緩衝區,有關這些方法的更多信息,請參閱格式化。oracle
要手動沖洗流,請調用其flush
方法,flush
方法在任何輸出流上都有效,但除非流被緩衝,不然無效果。函數