![](/img/trans.png)
[英]What 0 returned by InputStream.read(byte[]) means? How to handle this?
[英]How do you decide what byte[] size to use for InputStream.read()?
從 InputStreams 讀取時,如何決定 byte[] 使用的大小?
int nRead;
byte[] data = new byte[16384]; // <-- this number is the one I'm wondering about
while ((nRead = is.read(data, 0, data.length)) != -1) {
...do something..
}
你什么時候用小號和大號? 有什么區別? 數字是否要以 1024 為增量? 如果它是來自網絡的 InputStream 與來自磁盤的輸入流,它會有所不同嗎?
非常感謝,我似乎無法在其他地方找到明確的答案。
大多數人使用 2 的冪來表示大小。 如果緩沖區至少為 512 字節,則沒有太大區別( < 20% )
對於網絡,最佳大小可以是 2 KB 到 8 KB(底層數據包大小通常高達 ~1.5 KB)對於磁盤訪問,最快的大小可以是 8K 到 64 KB。 如果您使用 8K 或 16K,則不會有問題。
注意網絡下載,您可能會發現您通常不使用整個緩沖區。 對於 99% 的用例來說,浪費幾 KB 並不重要。
在那種情況下,我總是使用 2 的合理冪,在 2K 到 16K 的范圍內。 一般來說,不同的 InputStreams 會有不同的最優值,但是沒有簡單的方法來確定這個值。
為了確定最佳值,您需要更多地了解您正在處理的 InputStream 的確切類型,以及為 InputStream 提供服務的硬件規格等內容。
擔心這個可能是過早優化的情況。
這主要取決於您擁有多少內存以及您希望讀取多少數據。 您不想太頻繁地阻止,因此請考慮BenCole
的回答; 另一方面,如果您的處理速度比實際讀取速度慢,您不希望處理一小塊數據。
我個人嘗試使用庫並將選擇緩沖區大小的任務卸載給庫作者。 在那之后,我向自己保證不再閱讀庫代碼,因為這讓我很生氣。
我還要說的是,如果從InputStream
讀取(而不是從ReadableByteChannel
像FileChannel
或SocketChannel
),你不應該關心,只要你把它包裝在一個具有“正確”緩沖區大小的BufferedInputStream
:內部緩沖區將為您處理讀取,因此您可以專注於讀取您需要的部分。
在這種情況下,緩沖區大小可能就是您要查找的大小,我會將您重定向到@Peter Lawrey 的回答:從網絡訪問數據時為 2-8KB,從硬盤訪問時為 32-64KB(“塊"的磁盤)。
但是,當從ByteChannel
讀取時,您必須自己通過ByteBuffer
,您可以使用該值分配該緩沖區。
通過使用InputStream
類中的available()
方法。 來自 Javadoc:
返回可以從此輸入流讀取(或跳過)的字節數,而不會被此輸入流的方法的下一個調用者阻塞。 下一個調用者可能是同一個線程或另一個線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.