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()
如何返回-1closedByReader
为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来演示这个问题,这里的代码很有帮助。