Java 我应该为每行日志使用try with resources语句吗?

Java 我应该为每行日志使用try with resources语句吗?,java,java-7,writer,try-with-resources,Java,Java 7,Writer,Try With Resources,我想在每次有事情发生时都将日志(追加文本)记录到文件中。我发现这可能是Java 7的try with resources语句实现这一点的正确方法: public void log(String textLine) { try(PrintWriter output = new PrintWriter(new BufferedWriter(new FileWriter("Logfile.txt", true)))) { output.println(textLine);

我想在每次有事情发生时都将日志(追加文本)记录到文件中。我发现这可能是Java 7的try with resources语句实现这一点的正确方法:

public void log(String textLine) {
    try(PrintWriter output = new PrintWriter(new BufferedWriter(new FileWriter("Logfile.txt", true)))) {
        output.println(textLine);
    }catch (IOException e) {
        //exception handling
    }
}
我担心的是,这个log方法经常被调用,每次调用这个方法时,输出都会关闭并重新打开,这是不必要的。同时,我想从Java7的trywithresources语句特性中获益


我的担心是不是没有必要,因为重新打开和关闭一个writer并不是一个昂贵的操作?或者我应该使用Java 6的老式方式,即手动处理异常,并将输出声明为成员字段,并在应用程序结束时手动关闭输出?

不,您应该每次要在日志文件中添加新行时,都打开并关闭
FileWriter

你应该:

  • 在应用程序开始时打开日志文件
  • 追加
  • 调用
    flush()
  • 最后调用
    close()
或者,如果您想使用try with resources语句,那么调用logger方法的代码应该放在try with resources语句的主体中。由于这一点,您不必调用
close()
方法,因为它将被自动调用


然而,最好的解决方案是使用一个现有的、经过战斗测试的开源记录器,如log4j或logback,而不是重新启动轮子,它涵盖了所有这些内部细节,并公开了一个简单的API,允许您简单地记录所提供的消息。

您是否考虑过使用标准日志库,以便不必担心所有这些问题?这也将为您提供更大的灵活性,如日志级别和日志审核软件将能够更轻松地解析日志。自动调用“try with resource”
close()
:@SashaSalauyou“您做得根本不对,这里有一个更好的方法”是一个非常合理的答案。@Adam非常感谢您Adam,不仅为日志库(log4j、logbook)提供建议,还提供了手动执行的正确方法。