2008-09-24 3 views

答えて

1

自分の質問に答える:あなたはbuf.clear()read間のを呼び出す必要があります。おそらく、バッファがいっぱいであるため、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(); 
    } 
} 
+0

ハンギング?読み込み可能なAPIを見ると、バッファがいっぱいであれば、読み込みごとに0を返すビジーなループになると思いますが、読み込みしようとしていることを明示的に示さないため推測です。ハンギングとは、出力を多重に書き込むため、出力をブロックしたことを意味します。 –

+0

ループの詳細な動作を確認しませんでした。ブロックを読み込んだり、繰り返して0を返します。ネット効果:ループは決して終了しません。 –

+0

出力ストリームは循環バッファのように排水されていない有限の容量でなければならないと思います。たぶん、私は一般的に、ライブロックではなくデッドロックを意味するために「ハング」を使用するという点で、独特のものです。 –

0

となります。デッドロックと思われます。 in.read(buf)はCharBufferをロックし、out.append(buf)呼び出しを防ぎます。

これは、CharBufferが(ある種の)ロックを実装で使用していると仮定しています。 APIがクラスCharBufferについて何を言っていますか?

編集:申し訳ありませんが、私の脳には何らかの種類の短絡があります。私は他のものと混同しました。

0

CharBuffersは、期待通りに読者とライターではうまく動作しません。特に、Writer.append(CharBuffer buf)メソッドはありません。質問スニペットで呼び出されるメソッドはWriter.append(CharSequence seq)で、これはseq.toString()と呼ばれます。 CharBuffer.toString()メソッドはバッファの文字列値を返しますが、バッファは消耗しません。その後のReader.read(CharBuffer buf)の呼び出しでは、すでにフルバッファが取得されているため、0が返され、ループは無期限に継続されます。

これはハングアップのように感じますが、ループを通過するたびに最初の読み取りのバッファ内容をライターに追加しています。だから、あなたは目的地で多くの出力を見始めるか、作家の実装方法に応じて作家の内部バッファが大きくなるでしょう。

CharBufferソリューションがループを通過するたびに少なくとも2つの新しいchar []をビルドするため、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 /チャンネルまたはバイト[] /のIOStream実装はあなたが配管の文字をしている場合でも、望ましいだろう、あなたは、2つの文字エンコーディング間の変換をサポートする必要がある場合にのみ、これを使用してお勧めします。

関連する問題