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

Kew*_*ang 4 java writer java-7 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);
    }catch (IOException e) {
        //exception handling
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ada*_*ion 7

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

你应该:

  • 在应用程序开始时打开日志文件
  • 追加它
  • 呼叫 flush()
  • 最后打电话close().

或者如果要使用try-with-resources语句,则应将调用logger方法的代码放在try-with-resources语句的主体内.由于这个原因,您不必调用该close()方法,因为它将自动调用.

然而,最好的解决方案是,使用现有的,经过实战考验的开源记录器(如log4j或logback),而不是重新安装车轮,这些记录器涵盖所有这些内部细节,并公开一个简单的API,允许您只需记录提供的消息.