ストリームを閉じなかった場合、PipedInputStream.read()
は-1を返します。 closedByReader
が偽の場合、closedByWriter
は偽、connected
は真ですが-1を返します。なぜ私は終わったと思う? read()
が否定を返すべき条件は何ですか?ここでPipedInputStream.read()は-1を返します
EDIT 1
は、私はまだ変数の値をトレースすることはできませんが、私はそれは、Eclipseのデバッガで行から行へジャンプする方法を見ることができライブラリ関数のコード
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;
}
です。だから私はそれが最後の行で終了することを見た。ただ1つのwhile
ループが実行されます。前にrlen=1
を持っているので、変更できる唯一の理由はrlen += available
行です。この変数は-2
です。私はそれが最後にavailable = len - 1
を訪れるのを見ました。だから、len
は-1
する必要がありますが、...もちろん
EDIT 2
を2048
を渡し、エラーが地雷だったと他の場所では絶対でした。実際にPipedInputStream
は、固定サイズであると誤って構成されたAudioInputStream
にラップされました。サイズに達すると、ストリームの終了条件が発生していました。
この場合、 'read()'はブロックする必要があります。 –
'EOF'をバイナリストリームにどのように送ることができますか? –
あなたが正しいです、あなたが説明している状況は不可能と思われます。あなたは何かを誤解していないと確信していますか?たぶんあなたがこれを行うコードを表示すると、誰かがもっと助けることができるでしょう。 – trutheality