【问题标题】:Is opening and closing a PrintWriter object repeatedly bad practice in Java?在 Java 中反复打开和关闭 PrintWriter 对象是不好的做法吗?
【发布时间】:2015-12-16 23:40:23
【问题描述】:

我正在尝试编写一个非常简单的 Java 日志记录类,它可以写入日志文件,以便我可以在其他项目中重用它。我扩展了PrintWriter 类,以便在写入之前检测日志文件是否打开。

当用户完成记录后,他们必须在记录对象上调用.close() 来关闭文件。当仅集成到单类应用程序中时,这没什么大不了的,但现在我试图将此记录器类集成到几个不同的父类和子类中,它们都将引用同一个日志文件,并且不会关闭一个参考,我将无法打开另一个来自不同班级的参考。

每次记录某些内容时调用.open().write(msg).close() 会不会很糟糕? 消除手动 openclose 记录器的需要。或者有更好的解决方案吗?

我为 C++ 找到了 this similar question,但唯一的答案是“根据我的经验......”我正在寻找更深入的答案。

【问题讨论】:

  • 我认为这本质上是基于意见的,但通常打开和关闭文件(或不断重新创建对象)是不好的做法。 OTOH 日志记录往往是人们相对很少做的事情,因此尝试优化它并不总是有意义的。如果您遇到问题,请使用分析器。如果您没有问题,“如果没有损坏,请不要修复它。”

标签: java logging filewriter printwriter bufferedwriter


【解决方案1】:

我不建议同时在同一个文件中写入多个类。我的想法是为您的Logger 类实现一个队列,其中所有与之集成的类都将push 他们的日志记录到。

每当一个类将其日志推送到队列时,它应该要求记录器将write 发送到文件。

在您的 Logger 实例中创建一个布尔值 writing,以防止执行多个 write 命令以避免任何重复。

您的 write 方法会一直写入,直到队列为空,然后将 writing 布尔值重置为 false

// A sample logger class
public class Logger {
  static Queue<String> pending = new LinkedList<String>();
  static boolean writing = false;
  static PrintWriter pw = new PrintWriter("production.log", "UTF-8");

  public static void write() {
    if(!writing) {
      writing = true;
      pw.open();
      while(!pending.isEmpty()) {
        pw.println(pending.poll());
      }
      pw.close();
      writing = false;
    }
  }
}

您现在openclose 您的文件的频率降低了,并且您不会丢失任何日志。

【讨论】:

  • 我非常喜欢这个想法。在这个阶段,我不打算在任何类型的多线程系统中使用记录器类,但是,所以在单线程中,它的功能基本上与 opening writing 然后 closing 相同,对吗?
  • 如果一次只有一个类写入,没有同时写入,则与打开和关闭相同
猜你喜欢
  • 2012-11-25
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
相关资源
最近更新 更多