如果我没有关闭任何流,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
被错误地配置为固定大小。达到大小会导致流结束情况。
好吧,如果InputStream正在读取的下一个字节是-1,则InputStream必须返回-1。如果您的流没有关闭,则连接为真,我认为这只是您看到的数据