PipedInputStream.read()
如果我没有关闭任何流,如何返回 -1?closedByReader
为假,closedByWriter
为假,connected
为真,但返回-1;为什么它认为我完成了?什么时候read()
应该返回负数?
编辑 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
符合要求。这个变量应该等于-2
。我看到它available = len - 1
最后访问了一行。所以,len
应该是-1
,但是通过2048
......
编辑 2
当然,错误是我的,绝对是在另一个地方。实际上PipedInputStream
被包裹在AudioInputStream
其中被错误地配置为固定大小。达到大小导致流条件结束。