![](/img/trans.png)
[英]When to use read() or read(byte[]) or BufferedInputStream?
[英]inconsistent BufferedInputStream read(byte[]) behaviour
我對BufferedInputStream.read(byte [])的理解是,讀取操作從pos開始,並且讀取直到字節數組已滿或流結束。
我在BufferedInputStream上調用以下readInt方法。
public class XDRInputStream {
private InputStream stream;
private byte[] buffer4 = new byte[4]; // fixed size buffers
private byte[] buffer8 = new byte[8];
public XDRInputStream(InputStream stream) {
this.stream = stream;
}
public InputStream getInternalStream() {
return stream;
}
public int readInt() throws IOException {
if (stream.read(buffer4) != -1) {
return ((buffer4[0] & 0xFF) << 24)
| ((buffer4[1] & 0xFF) << 16)
| ((buffer4[2] & 0xFF) << 8)
| ((buffer4[3] & 0xFF));
} else {
throw new EOFException("End of stream");
}
}
當我在Eclipse調試器中跟蹤執行情況時, stream.read(buffer4)
調用-不管起始pos值如何-通常都會導致pos的值設置為4,並且讀取的4個字節是輸入中的前四個字節流。 在某些情況下,read(byte [])調用會靜默重置流嗎? 這似乎是預期的行為(這不是我的代碼),以這種方式運行時,程序可以正常運行。
我遇到的問題是,有時僅在Windows上,並且僅當輸入流包含特定內容時(在這種情況下,此錯誤消息是由於上游的套接字丟失而導致的),這種pos重置不會在預期的情況下發生到,這導致方法從流中的錯誤位置讀取並返回錯誤的值。
我們在Solaris上使用相同的代碼,雖然我尚未在該平台上完成調試器的逐步調試,但是在Solaris下,該程序運行良好,並且不會發生我嘗試修復的錯誤。 我可能不知道與流有關的特定於平台的問題嗎?
謝謝。
根據經驗,您不能一次依賴於從流中讀取整個數組。 如果您查看文檔 ,將會看到read(byte[])
返回值是read(byte[])
數,它可以是整個數組的長度或更少。 如果尚無數據,甚至為0。 而且讀取少於整個陣列是非常典型的(可能取決於OS)。
因此,您必須確保您實際讀取了4個字節。
我對BufferedInputStream.read(byte [])的理解是,讀取操作從pos開始,並且讀取直到字節數組已滿或流結束。
您的理解不正確。
您的理解與Javadoc完全矛盾,Javadoc表示,如果有必要,它將阻塞,直到至少一個字節可用,再讀取可用的任何內容,然后返回讀取的字節數計數;如果改為讀取EOS,則返回-1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.