簡體   English   中英

InputStream.read(byte[]) 返回的 0 是什么意思? 如何處理?

[英]What 0 returned by InputStream.read(byte[]) means? How to handle this?

InputStream.read(byte[])InputStream.read(byte[], int, int)返回的 0(讀取的字節數)是什么意思? 如何處理這種情況?

為了清楚起見,我的意思是read(byte[] b)read(byte[] b, int off, int len)方法返回讀取的字節數。

InputStream可能從對read(byte[])的調用中返回0的唯一情況是傳入的byte[]的長度為 0:

 byte[] buf = new byte[0];
 int read = in.read(buf); // read will contain 0

正如 JavaDoc 的這一部分所指定的:

如果 b 的長度為零,則不讀取任何字節並返回 0

我的猜測:您使用available()來查看緩沖區應該有多大,它返回0 請注意,這是對available()的濫用。 JavaDoc 明確指出:

使用此方法的返回值來分配旨在保存此流中所有數據的緩沖區是不正確的。

看一下 javax.sound.AudioInputStream#read(byte[] b, int off, int len) 的實現 ... 哎呀。 它們完全違反了標准 java.io.InputStream 語義,如果您請求的數據少於一幀,則返回讀取大小為 0。

所以不幸的是; 常見的建議(和 api 規范)應該排除在 len > 0 時必須處理返回零,但即使對於 JDK 提供的類,您也不能普遍依賴於任意類型的 InputStreams。

再一次,呸。

根據Java API Doc:

http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStream.html#read(byte[])

只有當您傳遞的 byte[] 有零項(新 byte[0])時才會發生這種情況。

在其他情況下,它必須返回至少一個字節。 如果達到 EOF,則為 -1。 或者一個例外。

當然:這取決於您使用的 InputStream 的實際實現!!! (可能是錯誤的)

當我構建一個擺動控制台輸出窗口並通過以下代碼為 stdout 和 stderr 創建一個讀取器線程時,我觀察到了相同的行為(讀取 0 個字節):

this.pi = new PipedInputStream();
                po = new PipedOutputStream((PipedInputStream)pi);
                System.setOut(new PrintStream(po, true));
當“主”搖擺應用程序退出時,我的控制台窗口仍然打開,我從 this.pi.read() 中讀取 0。 讀取的數據被放在控制台窗口上,導致某種競爭條件,只是忽略結果而不更新控制台窗口解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM