【问题标题】:Is Opening Java FileOutputStream efficient?打开 Java FileOutputStream 有效吗?
【发布时间】:2014-01-10 19:40:35
【问题描述】:

我现在正在为我的程序编写一个单例记录器,我想知道是在每次记录某些内容时打开和关闭它,还是在创建单例时打开流并在终止程序?如果我要这样做,我将如何在终止时关闭它?

【问题讨论】:

  • 最好打开一次,关闭一次。
  • 使用 log4j 之类的日志框架会更好。这是一件很难做到的事情。
  • Java 已经内置了日志记录;请参阅包 java.util.logging 的 API 文档。此外,还有著名的库,例如 SLF4J 和 Log4J。你正在重新发明轮子。

标签: java filestream


【解决方案1】:

打开文件一次的主要优势性能。您可以避免每次调用open 的惩罚,并寻找文件末尾以进行附加;如果文件很大(有些日志往往很大),情况会变得更糟。

缺点是:

  1. 如果写入器中有一些缓冲(延迟写入),您可能无法立即读取最后一行日志。但是,可以通过在每次写入后刷新来解决此问题(您可能会损失一些性能,但这通常无关紧要)。

  2. 您不能同时写入来自不同进程的同一日志。但是你可能不需要这个——如果你需要它,开闭解决方案仍然需要处理并发。

  3. 某些外部日志处理(通常是带有重命名的日志轮换)会出现问题。为此,您可能需要实现一些关闭和重新打开文件的信号。

通常情况下,利大于弊,因此一般规则是保持日志文件打开。但这取决于场景。

(正如其他答案指出的那样,通常您更愿意使用一些标准的日志记录库,而不是自己实现它。但是尝试一下,或者至少考虑所有涉及的问题是有启发性的)。

【讨论】:

    【解决方案2】:

    不要关闭它,只是刷新,这是 Log4j FileAppender 默认做的。

    【讨论】:

      【解决方案3】:

      您应该打开一次(然后关闭一次)。如果您什么都不做,Java 会为您关闭它。您可能更喜欢显式覆盖Object.finalize()

      【讨论】:

      • @StackOverflowException 是“如果你什么都不做,Java 会为你关闭它。”不清楚?
      • 你为什么要明确地这样做......那只是潜在的错误创造。
      猜你喜欢
      • 2013-07-25
      • 1970-01-01
      • 2019-09-17
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2011-10-06
      相关资源
      最近更新 更多