在 Java 中重复打开和关闭 PrintWriter 对象是不好的做法吗?

Is opening and closing a PrintWriter object repeatedly bad practice in Java?

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

当用户完成记录后,他们必须对记录对象调用 .close() 以关闭文件。当仅集成到单个 class 应用程序时,这没什么大不了的,但现在我正在尝试将此记录器 class 集成到几个不同的父和子 class es 将全部引用同一个日志文件,并且在不关闭一个引用的情况下,我将无法从不同的 class.

打开另一个

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

我发现 this similar question 适用于 C++,但唯一的答案是 "in my experience...",我正在寻找更深入的答案。

我不推荐多个 classes 同时写入同一个文件。我的想法是为您的 Logger class 实现一个队列,其中所有与之集成的 classes 将 push 它们的日志发送到

每当 class 将其日志推送到队列时,它应该要求记录器 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 您的文件不那么频繁而且您不会丢失任何日志。