本章内容包括3個部分:BufferedOutputStream介紹,BufferedOutputStream源碼,以及BufferedOutputStream使用示例。
BufferedOutputStream 是緩沖輸出流。它繼承于FilterOutputStream。
BufferedOutputStream 的作用是為另一個輸出流提供“緩沖功能”。
BufferedOutputStream 函數清單




說明:
BufferedOutputStream
的源碼非常簡單,這裡就BufferedOutputStream的思想進行簡單說明:BufferedOutputStream通過位元組數組來緩沖數
據,當緩沖區滿或者使用者調用flush()函數時,它就會将緩沖區的資料寫入到輸出流中。
關于BufferedOutputStream中API的詳細用法,參考示例代碼(BufferedOutputStreamTest.java):


運作結果:
生成檔案“out.txt”,檔案的内容是“abcdefghij”。
分步測試:
分别按照下面3種步驟測試程式,來檢視緩沖區大小以及flush()的作用。
第1種:原始程式。
(01) 運作程式。在程式等待使用者輸入時,檢視“out.txt”的文本内容;發現:内容為空。
(02) 運作程式。在使用者輸入之後,檢視“out.txt”的文本内容;發現:内容為“abcdefghij”。
從中,我們發現(01)和(02)的結果不同;之是以(01)中的out.txt内容為空,是因為out.txt對應的緩沖區大小是16位元組,而我們隻寫入了11個位元組,是以,它不會執行清空緩沖操作(即,将緩沖資料寫入到輸出流中)。
而(02)對應out.txt的内容是“abcdefghij”,是因為執行了out.close(),它會關閉輸出流;在關閉輸出流之前,會将緩沖區的資料寫入到輸出流中。
注意:重新測試時,要先删除out.txt。
第2種:在readUserInput()前添加如下語句,
這句話的作用,是将“緩沖區的内容”寫入到輸出流中。
(01) 運作程式。在程式等待使用者輸入時,檢視“out.txt”的文本内容;發現:内容為“abcdefghij”。
從中,我們發現(01)和(02)結果一樣,對應out.txt的内容都是“abcdefghij”。這是因為執行了flush()操作,它的作用是将緩沖區的資料寫入到輸出流中。
注意:重新測試時,要先删除out.txt!
第3種:在第1種的基礎上,将
修改為
(01) 運作程式。在程式等待使用者輸入時,檢視“out.txt”的文本内容;發現:内容為“abcdefghijklmnopqrst”(不含回車)。
(02) 運作程式。在使用者輸入之後,檢視“out.txt”的文本内容;發現:内容為“abcdefghijklmnopqrst”(含回車)。
從
中,我們發現(01)運作結果是“abcdefghijklmnopqrst”(不含回車)。這是因為,緩沖區的大小是16,而我們通過
out.write(ArrayLetters, 0,
20)寫入了20個位元組,超過了緩沖區的大小;這時,會直接将全部的輸入都寫入都輸出流中,而不經過緩沖區。
(02)運作結果是“abcdefghijklmnopqrst”(含回車),這是因為執行out.close()時,将回車符号'\n'寫入了輸出流中。