在Java中反复打开和关闭PrintWriter对象是不是很糟糕?

时间:2015-12-16 23:40:23

标签: java logging filewriter printwriter bufferedwriter

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

writing实例中创建一个布尔Logger,防止执行多个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的文件频率较低,并且您不会丢失任何日志。