2012-05-29 25 views
2

這更像是一個良知問題,而不是技術問題:p 我正在編寫一些java代碼以從服務器下載文件...爲此,我使用BufferedOutputStream方法的write()和BufferedInputStream方法的read()。Java BufferedOutputStream:要寫多少字節

所以我的問題是,如果我使用一個緩衝區來保存字節,什麼應該是要讀取的字節數?當然我可以讀取字節使用只是int byte = read()然後寫入(byte),或者我可以使用緩衝區。如果我採用第二種方法,那麼在定義每次讀取\寫入的字節數時,是否有任何方面需要注意?這個數字會影響我的計劃嗎?

Thks

回答

1

除非你有一個非常快速的網絡連接,該緩衝區的大小並沒有什麼影響。我會說4k緩衝區會很好,儘管使用緩衝區的大小並沒有什麼壞處。

這同樣可能適用於使用read()read(byte[]) ......假設您使用的是BufferedInputStream

除非你有一個非常快/低延遲的網絡連接,瓶頸將是數據速率,網絡和計算機的網絡接口,可以維持。對於典型的互聯網連接,應用程序可以將數據移動的速度比網絡快兩個或更多個數量級。所以除非你做一些愚蠢的事情(比如在未緩衝的數據流上做1字節讀取),否則Java代碼不會成爲瓶頸。

+0

首先回答,並有一個很好的答案:p我將在1024-4096之間設置緩衝區的大小。 Thks –

0

什麼是您的網絡連接中的MTU(最大流量單位)?例如,如果您使用UDP,則可以檢查該值並使用較小的字節數組。如果這不是一個問題,你需要檢查內存如何吃你的程序。我認爲1024 - 4096就會變好保存這些數據,並繼續接受

+0

我不能靠MTU,因爲這一計劃將來自不同網絡的執行。儘管如此,我將在1024-4096之間設置緩衝區的大小。 THKS。 –

1

的BufferedInputStream和的BufferedOutputStream通常依賴於System.arraycopy其實現。 System.arraycopy有一個本地實現,這可能依賴於memmove或bcopy。複製的內存量取決於緩衝區中的可用空間,但無論實現到本機代碼是否相當高效,都不會影響應用程序的性能,無論您正在讀/寫的字節數是多少。

然而,相對於的BufferedInputStream,如果設置了標誌的高限,新的內部緩衝可能需要創建。如果確實使用了標記,則讀取比舊緩衝區中可用字節數多的字節可能會導致臨時性能下降,儘管攤銷性能仍然是線性的。

斯蒂芬c項,你更有可能看到由於網絡性能問題。

+0

你的回答也是有效的,但是由於Stephen C是第一個回覆,他是贏家:無論如何。 –

+0

@PauloRodrigues:不擔心「贏」:-) –

0

如果您抽取數據,通常不需要使用任何Buffered流。只要確保使用傳遞給讀取方法的適當大小(8-64k)的臨時字節[]緩衝區(或者使用泵方法)。默認的緩衝區大小是大多數情況的使用過小(如果你使用一個更大的臨時數組它將被忽略反正)

相關問題