如果我沒有關閉任何流,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
,這是錯誤地配置爲固定大小。達到這個尺寸會導致流程結束。
在這種情況下,'read()'應該阻塞(等待寫者寫東西)。 – 2012-04-05 20:18:59
如何將'EOF'發送到二進制流? – 2012-04-05 20:21:06
你說得對,你描述的情況似乎是不可能的。你確定你沒有誤解任何東西嗎?也許如果你顯示一些代碼,這有人可以幫助更多。 – trutheality 2012-04-05 20:50:39