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
1 つのループのみが実行されます。しばらく前にあるのでrlen=1
、変更できる唯一の理由はrlen += available
インラインです。この変数は と等しいはずです-2
。最後に行にアクセスすることがわかりましたavailable = len - 1
。だから、len
はずですが-1
、合格2048
...
編集2
もちろん、エラーは私のものであり、絶対に別の場所にありました. 実際には、固定サイズとして誤って構成されたPipedInputStream
にラップされました。AudioInputStream
サイズに達すると、ストリームの終わりの状態が発生していました。