当我的程序启动时,它会打开一个文件并定期写入。(它不是日志文件;它是程序的输出之一。)我需要在程序的长度内使用该文件,但我不需要做任何特别的事情来结束文件;关闭它。
我为 Java 中的文件 I/O 收集了它,我应该实现AutoCloseable
它并将其包装在一个 try-with-resources 块中。然而,因为这个文件是长期存在的,并且它是程序的少数输出之一,我发现很难组织我打开的所有文件都包含在 try-with-resources 块中的东西。此外,顶级类(我的main()
函数所在的地方)不知道这个文件。
这是我的代码;注意缺乏writer.close()
:
public class WorkRecorder {
public WorkRecorder(String recorderFile) throws FileNotFoundException {
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(recorderFile)));
}
private Writer writer;
public void record(Data data) throws Exception {
// format Data object to match expected file format
// ...
writer.write(event.toString());
writer.write(System.lineSeparator());
writer.flush();
}
}
tl;博士如果资源是打开的输出文件,我是否需要实现AutoCloseable
和调用writer.close()
,并且在程序完成之前我不需要关闭它?我可以假设 JVM 和操作系统(Linux)会自动为我清理东西吗?
奖励(?):我在 C# 中IDisposeable
也遇到了这个问题。这个using
块,就像 Java 的 try-with-resources 构造一样,是一个很好的特性,当我有一些我要打开的东西,快速做一些事情,然后马上关闭。但通常情况并非如此,特别是对于文件,当对该资源的访问暂停一段时间,或者当需要管理多个此类资源时。如果我的问题的答案是“始终使用 try-with-resources 块”,我又被卡住了。