6


FileWriterを使用していますが、奇妙な動作に気づきました。コレクションを自分でバッファリングし、使用するすべてのx行をバッファリングします

 IOUtils.writelines(myList,"\n", writer );

ファイルには書き込みません。私はそれをより多くの行で呼び出し続け、それが非常にいっぱいになった後でのみファイルに書き込みます。
バッファを使用していますか?私はそのドキュメントでそれを見つけることができません。

4

4 に答える 4

12

クラス概要FileWriter2番目の文は次のように述べています。

このクラスのコンストラクターは、デフォルトの文字エンコードとデフォルトのバイトバッファーサイズが受け入れ可能であることを前提としています。これらの値を自分で指定するには、FileOutputStreamでOutputStreamWriterを作成します。

(私の強調)

したがって、明らかにバッファリングされています(デフォルトのバイトバッファサイズがゼロであり、言い回しが実際に奇妙である場合を除きます)。

を使用しているだけだと思いOutputStreamWriterますFileOutputStream。見てOutputStreamWriter

write()メソッドを呼び出すたびに、指定された文字に対してエンコーディングコンバータが呼び出されます。結果のバイトは、基になる出力ストリームに書き込まれる前にバッファーに蓄積されます。

(私の強調)

さまざまなレベルのさまざまなバッファが確実にフラッシュされるようにする場合は、可能な範囲で、flushメソッドの使用を検討してください。

于 2011-05-24T09:06:47.463 に答える
5

これは実装の詳細だと思いますが、ほとんどの実装ではバッファーを使用することを期待しています。あなたは確かにそれがバッファリングされていないことに依存するべきではありません。ライターをフラッシュまたは閉じるときは、問題ないはずです。

FileWriter個人的には、文字エンコードを指定できないため、使用するのが嫌いです。通常FileOutputStreamは、OutputStreamWriter代わりにをラップします。

于 2011-05-24T09:05:17.903 に答える
0

クラスを見てくださいsun.nio.cs.StreamEncoder.CharsetSE.implWrite()ByteBufferを使用します。

クラスStreamEncoder.CharsetSEは、OutputStreamWriterによって内部的に使用され、OutputStreamWriterはFileWriterによって内部的に使用されます。

于 2011-05-24T09:36:14.457 に答える
0

バッファを使用しているようですが、他の方法で使用されています(低レベル、バッファはデフォルトで空である可能性があります)。BufferedWriterでラップする必要があります。BufferedWriter javadocから:

"In general, a Writer sends its output immediately to the underlying
 character or byte stream.  Unless prompt output is required, it is advisable
 to wrap a BufferedWriter around any Writer whose write() operations may be
  costly, such as FileWriters and OutputStreamWriters.  For example,

  <pre>
  PrintWriter out
    = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
  </pre>"
于 2013-08-07T13:07:47.970 に答える