问题描述
|
我正在使用FileWriter,并且注意到了奇怪的行为。
我自己和我使用的每x行缓冲我的收藏
IoUtils.writelines(myList,\"\\n\",writer );
它不会写入文件。我继续用更多的行来称呼它,直到它写满后才写入文件。
它使用缓冲区吗?我在其文档中找不到它。
解决方法
ѭ1类概述的第二句话说:
此类的构造函数假定默认字符编码和默认字节缓冲区大小是可接受的。要自己指定这些值,请在FileOutputStream上构造一个OutputStreamWriter。
(我的重点)
显然,它是经过缓冲的(除非默认的字节缓冲区大小为零,并且它们的措词确实很奇怪)。
我怀疑它只是在
FileOutputStream
上使用了OutputStreamWriter
。看OutputStreamWriter
:
每次调用write()方法都会导致在给定的字符上调用编码转换器。生成的字节在写入底层输出流之前先在缓冲区中累积。
(我的重点)
如果要确保刷新各个级别的各种缓冲区,请使用flush
方法。
,我怀疑这是一个实现细节,但是我希望大多数实现都使用缓冲区。您当然不应该依赖它的无缓冲。刷新或关闭编写器时,应该没问题。
请注意,我个人不喜欢使用FileWriter
,因为它不允许您指定字符编码-我通常将FileOutputStream
换成OutputStreamWriter
。
,看课sun.nio.cs.StreamEncoder.CharsetSE.implWrite()
。
它使用一个ByteBuffer。
OutputStreamWriter内部使用StreamEncoder.CharsetSE类,而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>\"