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

del*_*ber 7 java

我正在看下面的例子

其中使用以下代码

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

做得有什么好处

FileWriter fw = new FileWriter("outfilename");
Run Code Online (Sandbox Code Playgroud)

我已经尝试了两种方法,当涉及到一次追加文件一行的任务时,它们的速度似乎相当

aro*_*oth 14

Javadoc中提供了关于这个问题的一个合理的讨论:

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

 PrintWriter out    = new PrintWriter(new BufferedWriter(new 
     FileWriter("foo.out")));   
Run Code Online (Sandbox Code Playgroud)

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

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

编辑

根据以下安德鲁的评论,FileWriter实际上使用了自己的固定大小的1024字节缓冲区.通过查看源代码确认了这一点.的BufferedWriter 来源,在另一方面,示出其使用和8192字节的缓冲区大小(默认值),其可以通过用户的任何其它期望的大小来配置.所以似乎BufferedWritervs 的好处FileWriter仅限于:

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

为了进一步搅浑水,在Java 6的实现OutputStreamWriter实际委托给StreamEncoder,使用它自己的缓冲区8192个字节的默认大小.而StreamEncoder缓冲区是用户可配置的,虽然目前还没有办法直接通过封闭的访问OutputStreamWriter.


and*_*oke 5

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

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