2017-10-15 124 views
0

我的問題是在某些方面類似於此: what's the purpose of BufferedOutputStream? 我已閱讀的答案在那裏,但還是有一件事我真的不明白: 所以在Java中的BufferedOutputStream具有內部緩衝區。如果此緩衝區已滿或flush()被調用,它將數據寫入基礎OutputStream(傳遞給BufferedOutputStream的構造函數的那個​​)。 到目前爲止確定。但對我來說,它看起來像是實際上任何OutputStream都會有這樣一個緩衝區 - 因爲基類OutputStream有一個flush()方法。此方法的描述是:「刷新此輸出流並強制寫出所有緩衝的輸出字節。」 因此......如果所有的OutputStream都有一個緩衝區,那麼BufferedOutputStream有什麼好處呢? 也許我誤解了一些東西......你能幫我嗎?java中BufferedOutputStream的好處是什麼?是否每個OutputStream都沒有緩衝區?

問候, 丹尼爾

+0

'這個方法的描述是sais:「刷新這個輸出流,並強制任何緩衝的輸出字節被寫出',你的問題是基於一個錯誤的假設 – EJP

+0

並非每個'OutputStream'都有一個內部緩衝區,但是當你用一個足夠大的數組參數調用'write'的時候,它仍然會有一個緩衝區,在這方面,'BufferedOutputStream'確實已經過時並且是一個過度使用的特性,更多的情況是修復代碼太多小寫,而不是通過使用BufferedOutputStream來解決問題,對於使用合理緩衝區大小的代碼,另外使用BufferedOutputStream甚至可以降低性能 – Holger

回答

1

的基類OutputStream是抽象。這意味着它定義了接口和所有輸出流的一些常見行爲。您不能實例化OutputStream實例。

的文件明確指出,

OutputStream的flush方法不做任何事。

確定是否使用緩衝區取決於具體實現。

0

的OutputStream沒有緩衝,你可以查看源代碼。 BufferedOutputStream有它自己的緩衝區,其flush()將自己的緩衝區中的字節寫入OS,然後刷新OS緩衝區。爲什麼使用的BufferedOutputStream是更有效的 - 因爲OutputStream.write可各自的時間,這是昂貴的操作調用OS,並把BufferedOutputStream.write字節緩衝並調用OS僅當緩衝區已滿或在沖洗

+0

它的flush()不做* nothing *。 OS緩衝區'關於它。 – EJP

+0

'刷新OS緩衝區'如何? – EJP