我正在使用FileWriter,我注意到了奇怪的行为。
我自己缓冲我的收藏和我使用的每一行
IOUtils.writelines(myList,"\n", writer );
它不写入文件。我继续用更多的行来调用它,只有在它非常满后它才会写入文件 它是否使用缓冲区?我无法在其文档中找到它。
答案 0 :(得分:12)
the FileWriter
class overview的第二句话说:
此类的构造函数假定默认字符编码和默认字节缓冲区大小是可接受的。要自己指定这些值,请在FileOutputStream上构造一个OutputStreamWriter。
(我的重点)
很明显它是缓冲的(除非默认的字节缓冲区大小为零,并且它们的措辞非常奇怪)。
我怀疑它只是在OutputStreamWriter
上使用FileOutputStream
。查看OutputStreamWriter
:
每次调用write()方法都会导致在给定字符上调用编码转换器。 生成的字节在写入基础输出流之前会在缓冲区中累积。
(我的重点)
如果您想确保刷新各种级别的各种缓冲区,请尽可能使用flush
method。
答案 1 :(得分:5)
我怀疑它是一个实现细节,但我希望大多数实现都使用缓冲区,是的。你当然不应该依赖对它进行无缓冲。当您刷新或关闭作者时,它应该没问题。
请注意,我个人不喜欢使用FileWriter
,因为它不允许您指定字符编码 - 我通常会将FileOutputStream
包裹在OutputStreamWriter
中。
答案 2 :(得分:0)
查看班级sun.nio.cs.StreamEncoder.CharsetSE.implWrite()
。
它使用 ByteBuffer 。
StreamEncoder.CharsetSE类在内部由OutputStreamWriter使用,其中inturn由FileWriter内部使用。
答案 3 :(得分: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>"