簡體   English   中英

不一致的BufferedInputStream read(byte [])行為

[英]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.

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