【问题标题】:Should I also flush() a stream when I'm done with it, or is close() enough?完成后我还应该刷新()一个流,还是 close() 就足够了?
【发布时间】:2014-05-26 05:03:26
【问题描述】:

使用完 BufferedWriter 后,我知道我应该致电 writer.close()。但是我也应该打电话给writer.flush()吗?还是没必要?

另外,如果我在包含流和 IO 代码的实例化的 try 块内或在它之外执行此操作,这有关系吗?

【问题讨论】:

标签: java io


【解决方案1】:

关闭将自动刷新您的流,因此您不必在关闭时刷新流。当您正在写入流并希望将中间值推送到文件/输出流时,刷新很有用,这样如果程序崩溃,数据也不会丢失。

从 Java 7 及更高版本开始,您可以使用 try-with-resources 来避免编写清理代码来清理流。

try-with-resources 语句是声明一个或多个资源的 try 语句。资源是程序完成后必须关闭的对象。 try-with-resources 语句确保每个资源在语句结束时关闭。

【讨论】:

  • 在包含 IO 代码和写入器/读取器实例化的 try 块内部或外部调用 writer/reader.close() 是否重要?
  • 如果您使用的是 JDK 7 和 aboe,请使用 try with resource,这样可以节省您编写代码来清理/关闭流的工作。
  • 谢谢,不过你能回答我最后一个问题吗?
  • 理想情况下,流应该在 finally 块中关闭,这样即使有一些异常,它也会在 finally 块中关闭。
【解决方案2】:

根据我的经验,只有当您想要/需要确保当前数据必须写入流时,您才应该调用flush。当您使用小文件时,您只需直接调用close,因为这已经在写入文件流之前触发了刷新。但是当您使用更大的文件时,例如一个有 100 万行或更多行的文件,那么最好不时调用flush(例如在写入 10k 行之后),以便写入磁盘并简化由close 调用的最终flush。这可以在程序崩溃的情况下完成。

【讨论】:

    【解决方案3】:

    方法 close() 将自动调用 (f)flush()

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多