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