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

在Java中,使用BufferedWriter附加到文件有什么好处?,java,Java,我正在看以下内容 它使用以下代码 try { BufferedWriter out = new BufferedWriter(new FileWriter("outfilename")); out.write("aString"); out.close(); } catch (IOException e) {} 比做有什么好处 FileWriter fw = new FileWriter("outfilename"); 我已经尝试了这两种方法,在

我正在看以下内容

它使用以下代码

try {
      BufferedWriter out = new BufferedWriter(new FileWriter("outfilename"));
      out.write("aString");
      out.close();
    } 
catch (IOException e) {}
比做有什么好处

FileWriter fw = new FileWriter("outfilename");

我已经尝试了这两种方法,在每次向文件追加一行的任务中,它们的速度似乎相当

当负载较高时,更容易看到缓冲区的有效性。把这个循环写出来。写上几千遍,你就会发现不同

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

提供了关于此主题的合理讨论:

通常,编写器会立即将其输出发送到底层 字符或字节流。除非需要提示输出,否则它是 建议将BufferedWriter包装在任何write()的编写器周围 操作成本可能很高,例如文件编写器和OutputStreamWriter。 比如说,

 PrintWriter out    = new PrintWriter(new BufferedWriter(new 
     FileWriter("foo.out")));   
将PrintWriter的输出缓冲到 文件如果没有缓冲,每次调用print()方法都会 将字符转换为字节,然后写入 立即发送到文件,这可能会非常低效

如果你同时写大量的文本(比如整行),那么你可能不会注意到有什么不同。但是,如果有很多代码一次只追加一个字符,那么
BufferedWriter
将更加高效

编辑

根据andrew下面的评论,
FileWriter
实际上使用自己的固定大小1024字节缓冲区。这一点通过观察数据得到了证实。另一方面,
BufferedWriter
显示它使用和8192字节缓冲区大小(默认值),用户可以将其配置为任何其他所需大小。因此,
BufferedWriter
FileWriter
相比,其优点似乎仅限于:

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

为了进一步搅浑局势,OutputStreamWriter的of实际上委托给了a,它使用自己的缓冲区,默认大小为8192字节。而
streamncoder
缓冲区是用户可配置的,尽管无法通过封装的
OutputStreamWriter

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


我认为这是错误的。正如javadocs中所说,filewriter确实有一个buffer-@andrew-很好的观点,我的回答是基于
BufferedWriter
Javadoc所说的。然而,在看了其中一些之后,您似乎是正确的,至少对于
FileWriter
。从
OutputStreamWriter
派生的任何内容都将使用固定大小的1024字节缓冲区。是的,这很令人惊讶。我本来打算写一个与你的答案类似的答案,直到我在outputsteamwriter中偶然发现了这条评论。这可能是因为很多人忽略了最佳实践,没有缓冲他们的filewriter:,但是在较大的字符串上调用多字节转换要比其他方法有效得多(这至少在windows上是正确的,但我认为linux也是如此)@Voo实际上,这是“最佳实践”不经意地将每个流包装成一个缓冲的对应流,这是应该质疑的。我见过缓冲流被包装在另一个缓冲流中,因为代码首先包装任何任意接收的流。虽然大多数流本质上已经缓冲过,但当没有缓冲时,使用缓冲流只有在你赚很多钱时才有帮助太小的读或写请求,所以这是应该修复的(因此,NIO通道没有这样的缓冲包装)。好的,OP的例子是这样一个例子,根本没有从缓冲中受益……而字符集编码器的性能实际上取决于您调用它的频率(而不是字符总数)?