在Java中,使用BufferedWriter附加到文件有什么好处?

我正在看下面的例子

其中使用以下代码

try { BufferedWriter out = new BufferedWriter(new FileWriter("outfilename")); out.write("aString"); out.close(); } catch (IOException e) {} 

做得有什么好处

 FileWriter fw = new FileWriter("outfilename"); 

我已经尝试了两种方法,它们在速度方面似乎可以在一次添加一行文件

Javadoc就此主题提供了合理的讨论:

通常,Writer会立即将其输出发送到基础字符或字节流。 除非需要提示输出,否则建议将BufferedWriter包装在任何write()操作可能代价高昂的Writer周围,例如FileWriters和OutputStreamWriters。 例如,

  PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out"))); 

将PrintWriter的输出缓冲到文件。 如果没有缓冲,每次调用print()方法都会导致字符转换为字节,然后立即写入文件,这可能效率很低。

如果你一次写大块文本(比如整行),你可能不会注意到差异。 但是,如果你有很多代码一次追加一个字符,那么BufferedWriter会更有效率。

编辑

根据以下安德鲁的评论, FileWriter实际上使用自己的固定大小的1024字节缓冲区。 通过查看源代码确认了这一点。 另一方面, BufferedWriter 源显示它使用8192字节缓冲区大小(默认),用户可以将其配置为任何其他所需大小。 所以看起来BufferedWriterFileWriter的好处仅限于:

  • 较大的默认缓冲区大小。
  • 能够覆盖/自定义缓冲区大小。

为了进一步混乱 , OutputStreamWriter的Java 6实现实际上委托给StreamEncoder ,它使用自己的缓冲区,默认大小为8192字节。 StreamEncoder缓冲区是用户可配置的,尽管无法通过封闭的OutputStreamWriter直接访问它。

这在outputstreamwriter的javadocs中有解释。 文件写入器确实有一个缓冲区(在底层的outputstreamwriter中),但是在每次写入调用时都会调用字符编码转换器。 使用外部缓冲区可以避免频繁调用转换器。

http://download.oracle.com/javase/1.4.2/docs/api/java/io/OutputStreamWriter.html

当负载高时,更容易看到缓冲有效性。 循环out.write几千次,你应该看到一个区别。

对于在一次调用中传递的几个字节,可能BufferedWriter更糟糕(因为它可能稍后调用FileOutputStream)。