Java范围界定以及如何执行对公共日志文件的写入



如何构建代码以允许从不同代码部分向单个日志文件写入文件?我认为用一个静态对象作为文件句柄,打开一次文件,然后使用这个静态文件句柄从任何代码段对文件执行缓冲写入是合适的。

应该如何确定代码的范围,以及应该如何将异常处理应用于文件写入(我所附的简化代码显示了我不正确的异常处理中的多个错误,静态声明似乎是错误的(。编译器坚持对声明进行异常处理[how?],这样无论何时使用文件句柄都可以使用异常处理(这里我完全缺少一些基本内容(。

简单地说,我可以选择将需要写入日志的每个代码部分都写入日志,只需打开文件、写入并关闭,但这是低效的。我看到的所有文件编写示例都只是将所有打开、写入、关闭操作捆绑在一个小代码片段中,但我的文件操作分布在类中的多个方法中。

声明文件句柄对象,并使用它从不同的代码段写入文件,以及正确处理io异常的最佳方法是什么?


public class MyApp3 {
// create the file handle
static FileWriter log = new FileWriter("Logfile.txt", true);  // compiler flags ERROR on this line
// "unreported exception IOException; must be caught or declared to be thrown"
static BufferedWriter bufferedLog = new BufferedWriter(log);
static void Activity1() {
bufferedLog.write("Activity1 actions written to log");  // compiler flags ERROR on this line
// "unreported exception IOException; must be caught or declared to be thrown"
}
static void Activity2() {
bufferedLog.write("Activity2 actions written to log");  // compiler flags ERROR on this line
// "unreported exception IOException; must be caught or declared to be thrown"
}
public static void main(String[] args) {
Activity1();  // performs some file writes
Activity2();  // performs some file writes
try {
bufferedLog.write("Last write to file before close.");
} catch (IOException e) {   
e.printStackTrace();
} finally {
bufferedLog.close();  // compiler flags ERROR on this line
// "unreported exception IOException; must be caught or declared to be thrown"
}
}
}

考虑使用日志库-它们已经解决了您在问题中提出的所有问题。Log4j(2(、Logback就是这样的库的例子甚至还有一个内置在JDK中(尽管几乎没有人真正使用它——它被称为JULI——搜索包java.util.logging(

因此,就这些库而言,您将有多个与附加的文件相关联的记录器,该文件将写入";单个";文件。当这个文件达到一定大小时,你可以旋转它,库会删除过时的文件,等等。此外,您还可以定义消息的格式、日志异常等。总而言之,我强烈建议不要这样做;重新发明轮子";并使用上述生产就绪解决方案之一

最新更新