在刷新Java之前将信息添加到bufferWriter

时间:2018-09-27 13:20:28

标签: java performance

我了解到BufferedWriter在将信息写入文件之前会先存储信息,然后再执行使用flush()Append()等将信息写入文件的操作。

我从多个来源收集信息,所以目前我正在做的是在每个来源中循环并每次将其直接附加到文件中,但是我要完成的工作是将所有信息添加到{{1 }},并在完成循环后,将其写入文件,该怎么办?

我试图通过不多次将数据刷新到文件中来提高性能。性能是有问题的,因为这可能循环一百万次。

这是我目前正在做的事情:

  1. 打开BufferedWriter
  2. 从其他来源读取数据并存储在缓冲区中
  3. 将存储的数据追加到文本文件中(在此处清空缓冲区)
  4. 重复步骤2.-和3.- 50次
  5. 关闭文本文件

这就是我想要做的:

  1. 打开BufferedWriter
  2. 从其他来源读取数据并存储在缓冲区中
  3. 重复步骤2.- 50次
  4. 附加所有收集的数据(通过50个循环收集的数据)
  5. 关闭文件

这是代码。

BufferedWriter

2 个答案:

答案 0 :(得分:0)

  

我试图通过不将数据多次刷新到文件中来提高性能

您是否在每次写入后手动刷新数据?不要那样做

否则,在实例化BufferedWriter时指定较大的大小。

您可以选择使用StringBuilder首先聚合输出。但是,我认为您的输出要比要存储在内存中的更多。

最后,确实有性能成本吗?

===

BufferedWriter将优化其执行的实际写入。只要您指定较大的缓冲区大小(例如10,000),对缓冲区的多次小写操作就不会引起写操作,直到缓冲区已满。我看到您正在“清除”缓冲区的评论。不要那样做不用理会BufferedWriter,让它做事。

如果要积累信息,然后由于某种原因而丢弃它,请使用StringBuilder进行积累,然后将StringBuild内容写入Writer。

答案 1 :(得分:0)

当您指示缓冲写入器时,它将刷新。并且在任何时候缓冲区变满。确定缓冲区何时变满可能很棘手。确实,您无需关心。缓冲写入器将提高性能,无论何时刷新。相反,您的输出代码应使用BufferedWriter just like其他任何Writer

我还在您的代码中看到您反复打开和关闭输出文件。您几乎肯定不需要这样做。而是在程序的更高级别打开和关闭文件,因此它在每次迭代时都保持打开状态。