2012-04-05 118 views
0

如果我沒有關閉任何流,PipedInputStream.read()如何返回-1? closedByReader爲假,closedByWriter爲假,connected爲真,但返回-1;爲什麼它認爲我完成了? read()應該返回負數時的條件是什麼?PipedInputStream.read()返回-1

編輯1

這裏是庫函數

public synchronized int read(byte b[], int off, int len) throws IOException { 
if (b == null) { 
    throw new NullPointerException(); 
} else if (off < 0 || len < 0 || len > b.length - off) { 
    throw new IndexOutOfBoundsException(); 
} else if (len == 0) { 
    return 0; 
} 

    /* possibly wait on the first character */ 
int c = read(); 
if (c < 0) { 
    return -1; 
} 
b[off] = (byte) c; 
int rlen = 1; 
while ((in >= 0) && (len > 1)) { 

    int available; 

    if (in > out) { 
    available = Math.min((buffer.length - out), (in - out)); 
    } else { 
    available = buffer.length - out; 
    } 

    // A byte is read beforehand outside the loop 
    if (available > (len - 1)) { 
    available = len - 1; 
    } 
    System.arraycopy(buffer, out, b, off + rlen, available); 
    out += available; 
    rlen += available; 
    len -= available; 

    if (out >= buffer.length) { 
    out = 0; 
    } 
    if (in == out) { 
      /* now empty */ 
    in = -1; 
    } 
} 
return rlen; 
} 

我無法跟蹤變量值還沒有的代碼,但我可以看到它怎麼行跳躍Eclipse調試器排隊。所以我看到它在最後一行退出。只有一個while循環執行。由於之前我們有rlen=1,因此它可以改變的唯一原因是在rlen += available一行。這個變量shuld等於-2。我看到它最後一次訪問available = len - 1。所以,len-1,但通過2048 ...

EDIT 2

當然,錯誤是我的,是絕對在其他地方。其實PipedInputStream被包裝成AudioInputStream,這是錯誤地配置爲固定大小。達到這個尺寸會導致流程結束。

+0

在這種情況下,'read()'應該阻塞(等待寫者寫東西)。 – 2012-04-05 20:18:59

+0

如何將'EOF'發送到二進制流? – 2012-04-05 20:21:06

+1

你說得對,你描述的情況似乎是不可能的。你確定你沒有誤解任何東西嗎?也許如果你顯示一些代碼,這有人可以幫助更多。 – trutheality 2012-04-05 20:50:39

回答

-3

好吧,InputStream將不得不返回-1,如果它正在讀取的下一個字節是-1。如果你的數據流沒有關閉,連接是真的,我想這只是你正在看到的數據。

+0

你是怎麼知道的?據說我不能在流上發送0xFF字節? – 2012-04-05 20:22:26

+0

顯然你可以通過一個流發送0xFF ... – ControlAltDel 2012-04-05 20:24:02

+0

可能你不知道讀取函數原型嗎?這裏是http://docs.oracle.com/javase/6/docs/api/java/io/PipedInputStream.html – 2012-04-05 20:25:14