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

Should I use a try-with-resources statement for each line of log?

我想在每次发生事情时记录(追加文本)到一个文件中。我发现这可能是使用 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
    }
}

我担心的是这个日志方法被频繁调用,每次调用这个方法时输出都关闭并重新打开,这是不必要的。同时,我想受益于 Java 7 的 try-with-resources 语句功能。

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

不,您应该 每次要向日志文件追加新行时打开和关闭 FileWriter

你应该:

  • 在应用程序启动时打开日志文件
  • 附加到它
  • 致电flush()
  • 最后调用 close()

或者如果你想使用 try-with-resources 语句,那么调用记录器方法的代码应该放在 try-with-resources 语句的主体中。由于这一点,您将不必调用 close() 方法,因为它会自动调用。

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