2012-02-14 22 views
1

使用方法write(byte [] b)寫入BufferedOutputStream時,將使用FilterOutputStream的寫入方法。該文件說:將(byte [] b)寫入BufferedOutputStream會發生什麼? (Java)

「FilterOutputStream的write方法調用的三個參數的write方法與參數B,0和b.length個。」

與三個參數寫入方法是指什麼? FilterOutputStream中的一個,還是BufferedOutputStream中的一個? (即寫入是否被實際緩存?)。

我相信這是,但我不確定。

+0

*它的*寫法。它自己的。這很清楚。 Downvoting。 – EJP 2012-02-15 01:23:44

+0

它不是「非常清楚」,因爲它沒有一個。 :)但是,最終它會以BufferedOutputStream的覆蓋方法結束(易於使用eclipse進行檢查,只需按Ctrl並單擊兩次方法即可)。 – eckes 2014-10-08 23:47:35

回答

1

BufferedOutputStream覆蓋write(byte[], int, int)方法,以便調用新的覆蓋。是的,寫入被緩衝。

1

答案是肯定和否。總結我的發現:有效結果與承諾(「緩衝」)有點不同,因爲流是否立即刷新取決於緩衝區大小和每次調用存儲的數據量。

以下是從稍微更詳細http://docs.oracle.com/javase/7/docs/api/java/io/BufferedOutputStream.html(強調我自己的):

寫入LEN從指定的字節數組以字節偏移量off 此緩衝的輸出流

通常,此方法將給定數組中的字節存儲到此數據流的緩衝區中,根據需要將緩衝區刷新到基礎輸出數據流。但是,如果所請求的長度至少與此流的緩衝區一樣大,則此方法將刷新緩衝區並將字節直接寫入基礎輸出流。因此多餘的BufferedOutputStreams不會不必要地複製數據。

+0

它與BufferedOutputStream一樣被緩存,不是嗎? – 2012-02-14 19:07:11

+0

確實。只是說在每次調用之後進行刷新的效果與使流無緩衝相同或更差。這完全取決於OP是否根據每次通話中存儲的數據量選擇合適的緩衝區大小。 – 2012-02-14 19:12:12

+0

當你解釋eznme時,我意識到了寫(byte [],int,int)方法的微妙之處。不過謝謝。正如路易斯所說,當我說「緩衝」時,我的意思是「緩衝」,意思是「涉及緩衝區」 – user1209776 2012-02-14 19:20:23