2012-04-05 6 views
0

ストリームを閉じなかった場合、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にラップされました。サイズに達すると、ストリームの終了条件が発生していました。

+0

この場合、 'read()'はブロックする必要があります。 –

+0

'EOF'をバイナリストリームにどのように送ることができますか? –

+1

あなたが正しいです、あなたが説明している状況は不可能と思われます。あなたは何かを誤解していないと確信していますか?たぶんあなたがこれを行うコードを表示すると、誰かがもっと助けることができるでしょう。 – trutheality

答えて

-3

まあ、ストリームの次のバイトが-1だった場合、InputStreamは-1を返す必要があります。あなたのストリームが閉じていない場合、接続は真です。これはあなたが見ているデータだと思います。

+0

どうやってそれを知ったのですか?ストリームの上に0xFFバイトを送ることができないと言われていますか? –

+0

明らかにあなたはストリーム上で0xFFを送ることができます... – ControlAltDel

+0

あなたは関数のプロトタイプを読むことを知らないかもしれませんか?ここでは、http://docs.oracle.com/javase/6/docs/api/java/io/PipedInputStream.html –

関連する問題