Java read()返回-1

Java read()返回-1,java,stream,pipe,eof,Java,Stream,Pipe,Eof,如果我没有关闭任何流,PipedInputStream.read()如何返回-1closedByReader为false,closedByWriter为false,connected为true,但返回-1;为什么它认为我完成了?当read()应返回负值时,条件是什么 编辑1 这是库函数的代码 public synchronized int read(byte b[], int off, int len) throws IOException { if (b == null) { thr

如果我没有关闭任何流,
PipedInputStream.read()
如何返回-1
closedByReader
为false,
closedByWriter
为false,
connected
为true,但返回-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;
}
public synchronized int read(字节b[],int off,int len)引发IOException{
如果(b==null){
抛出新的NullPointerException();
}else if(off<0 | | len<0 | | len>b.长度-off){
抛出新的IndexOutOfBoundsException();
}else if(len==0){
返回0;
}
/*可能是等待第一个字符*/
int c=read();
if(c<0){
返回-1;
}
b[关]=(字节)c;
int-rlen=1;
而((in>=0)和&(len>1)){
int可用;
如果(输入>输出){
可用=Math.min((buffer.length-out),(in-out));
}否则{
可用=buffer.length-out;
}
//在循环外部预先读取一个字节
如果(可用>(镜头-1)){
可用=len-1;
}
系统阵列复制(缓冲区、输出、b、关闭+rlen,可用);
out+=可用;
rlen+=可用;
len-=可用;
if(out>=buffer.length){
out=0;
}
如果(输入==输出){
/*现在空了*/
in=-1;
}
}
返回rlen;
}
我还不能跟踪变量值,但我可以在Eclipse调试器中看到它是如何从一行跳到另一行的。所以我看到它在最后一行出口。只有一个
,而
循环执行。由于我们在while之前有
rlen=1
,因此它可以更改的唯一原因是
rlen+=available
行。此变量应等于
-2
。我看到它最后访问了
available=len-1
行。所以,
len
应该是
-1
,但是通过
2048

编辑2


当然,错误是我的,完全是另一回事。实际上,
PipedInputStream
被包装到
AudioInputStream
中,该文件被错误地配置为具有固定大小。达到该大小会导致流结束情况。

如果InputStream正在读取的流上的下一个字节是-1,则InputStream必须返回-1。如果您的流未关闭,则connected为true,我认为这只是您看到的数据,在这种情况下,
read()
应该阻止(等待写入程序写入内容)。如何将
EOF
发送到二进制流?您是对的,您描述的情况似乎不可能。你确定你没有误解什么吗?也许如果你展示一些代码来做这件事,有人会帮上更多的忙。当然我不确定。但是如何检查一些明显的原因呢?SSCCE不应该是JDK代码,而是如何实际使用该代码。你怎么知道的?哪里说我不能通过流发送0xFF字节?可能你不知道读取函数原型?这里是,也就是说,不可能混合返回状态和返回数据。@Voo所以在我的情况下,流没有关闭。那么它如何返回
-1
?@Suzan,该字段必须由写入线程(或关闭时的读卡器)设置。在各种错误情况下工作似乎并不特别安全。我会发布一些SSCCE来演示这个问题,这里的代码很有帮助。