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 デバッガーで行から行へとジャンプする様子を確認できます。そのため、最後の行で終了することがわかりました。while1 つのループのみが実行されます。しばらく前にあるのでrlen=1、変更できる唯一の理由はrlen += availableインラインです。この変数は と等しいはずです-2。最後に行にアクセスすることがわかりましたavailable = len - 1。だから、lenはずですが-1、合格2048...

編集2

もちろん、エラーは私のものであり、絶対に別の場所にありました. 実際には、固定サイズとして誤って構成されたPipedInputStreamにラップされました。AudioInputStreamサイズに達すると、ストリームの終わりの状態が発生していました。

4

1 に答える 1