java - 我应该为每一行日志使用 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);
    }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,使您可以简单地记录提供的消息。

关于java - 我应该为每一行日志使用 try-with-resources 语句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30194388/

相关文章:

java - 如何在selenium webdriver的多选框中选择元素

java - 无法连接到 MS Access 数据库?

java - MongoDB 与使用 Java 的 Play Framework

java - Credentials.acquireTGTFromCache(null, null) 使用 jre 7 返回 null

java - write() 方法无法识别 TextArea

python-3.x - python 3 如何使用 csv writer 编写 utf-8

java - Python `itertools.chain` 等同于 Java?

eclipse - Java 7 中的 EMMA [MAIN_METHOD_NOT_FOUND]

java - 将应用程序迁移到 Java 7 的动机和动机

java - 每行写入新的 CSV 文件 (JAVA)