0

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其中被错误地配置为固定大小。达到大小导致流条件结束。

4

1 回答 1

-3

好吧,如果它正在读取的流中的下一个字节是-1,则 InputStream 必须返回-1。如果您的流没有关闭,connected 是真的,我认为这只是您看到的数据

于 2012-04-05T20:20:52.633 回答