FileWriterを使用していますが、奇妙な動作に気づきました。コレクションを自分でバッファリングし、使用するすべてのx行をバッファリングします
IOUtils.writelines(myList,"\n", writer );
ファイルには書き込みません。私はそれをより多くの行で呼び出し続け、それが非常にいっぱいになった後でのみファイルに書き込みます。
バッファを使用していますか?私はそのドキュメントでそれを見つけることができません。
FileWriterを使用していますが、奇妙な動作に気づきました。コレクションを自分でバッファリングし、使用するすべてのx行をバッファリングします
IOUtils.writelines(myList,"\n", writer );
ファイルには書き込みません。私はそれをより多くの行で呼び出し続け、それが非常にいっぱいになった後でのみファイルに書き込みます。
バッファを使用していますか?私はそのドキュメントでそれを見つけることができません。
クラス概要のFileWriter
2番目の文は次のように述べています。
このクラスのコンストラクターは、デフォルトの文字エンコードとデフォルトのバイトバッファーサイズが受け入れ可能であることを前提としています。これらの値を自分で指定するには、FileOutputStreamでOutputStreamWriterを作成します。
(私の強調)
したがって、明らかにバッファリングされています(デフォルトのバイトバッファサイズがゼロであり、言い回しが実際に奇妙である場合を除きます)。
を使用しているだけだと思いOutputStreamWriter
ますFileOutputStream
。見てOutputStreamWriter
:
write()メソッドを呼び出すたびに、指定された文字に対してエンコーディングコンバータが呼び出されます。結果のバイトは、基になる出力ストリームに書き込まれる前にバッファーに蓄積されます。
(私の強調)
さまざまなレベルのさまざまなバッファが確実にフラッシュされるようにする場合は、可能な範囲で、flush
メソッドの使用を検討してください。
これは実装の詳細だと思いますが、ほとんどの実装ではバッファーを使用することを期待しています。あなたは確かにそれがバッファリングされていないことに依存するべきではありません。ライターをフラッシュまたは閉じるときは、問題ないはずです。
FileWriter
個人的には、文字エンコードを指定できないため、使用するのが嫌いです。通常FileOutputStream
は、OutputStreamWriter
代わりにをラップします。
クラスを見てくださいsun.nio.cs.StreamEncoder.CharsetSE.implWrite()
。ByteBufferを使用します。
クラスStreamEncoder.CharsetSEは、OutputStreamWriterによって内部的に使用され、OutputStreamWriterはFileWriterによって内部的に使用されます。
バッファを使用しているようですが、他の方法で使用されています(低レベル、バッファはデフォルトで空である可能性があります)。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>"