質問

なぜ、以下の方法でハング?

public void pipe(Reader in, Writer out) {
    CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE);
    while( in.read(buf) >= 0 ) {
      out.append(buf.flip());
    }
}
役に立ちましたか?

解決

答えを自分の問題:お電話 buf.clear() との間 reads.ここから, read ぶらぶらではのバッファがいっぱい。正確にコード

public void pipe(Reader in, Writer out) {
    CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE);
    while( in.read(buf) >= 0 ) {
      out.append(buf.flip());
      buf.clear();
    }
}

他のヒント

いることは難航している。のです。read(buf)ロックのCharBufferとを防ぎます。append(buf)。

ると仮定するとCharBuffer使のロックの一種)を実施します。どのようなAPIについてはクラスCharBuffer?

編集:申し訳、内蔵の短絡保護回路により、短絡に私の頭の中は...私混同で、地下鉄からも近くて便利。

CharBuffers働いていないと読み書きとしてきれいにしてします。特になし Writer.append(CharBuffer buf) 方法。の方法によって呼び出され問題のスニペットは Writer.append(CharSequence seq), るを呼び出すだけです seq.toString().の CharBuffer.toString() メソッドは文字列を返します値でのバッファーなどのドレインのバッファです。その後の呼び出 Reader.read(CharBuffer buf) を得て、既にフルバッファと0を返します陸のループの継続を無期限に設定されています。

このようハングすることは実要素の最初の読みのバッファのコンテンツのライター毎にループを実行します。のんのいずれかるように多くの出力先のライターの内部バッファの成長によっては、どのようにライターが実装されています。

しんでいchar[]実施の場合のみでのCharBuffer液巻ビルの少なくとも二つの新しいchar[]毎にループを実行します。

public void pipe(Reader in, Writer out) throws IOException {
    char[] buf = new char[DEFAULT_BUFFER_SIZE];
    int count = in.read(buf);
    while( count >= 0 ) {
        out.write(buf, 0, count);
        count = in.read(buf);
    }
}

さんのみを使用することをお勧めしこの対応させる必要がある場合には変換すると文字エンコーディングについて、そうでない場合はByteBuffer/チャンネルまたはbyte[]/IOStream実施いる場合であっても該当します配管の文字です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top