gpt4 book ai didi

java - Java 程序终止时未能关闭文件有什么危害吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:16 24 4
gpt4 key购买 nike

当我的程序启动时,它会打开一个文件并定期写入该文件。 (它不是日志文件;它是程序的输出之一。)我需要让文件在程序的长度内可用,但我不需要做任何特别的事情来结束文件;只需关闭它即可。

我收集到,对于 Java 中的文件 I/O,我应该实现 AutoCloseable 并将其包装在一个 try-with-resources block 中。然而,因为这个文件是长期存在的,而且它是程序的几个输出之一,我发现很难组织一些东西,这样我打开的所有文件都包含在 try-with-resources block 中。此外,顶级类(我的 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;dr 如果资源是打开的输出文件,我是否需要实现 AutoCloseable 并调用 writer.close(),以及在程序完成之前我永远不需要关闭它?我可以假设 JVM 和操作系统 (Linux) 会自动为我清理这些东西吗?

奖励 (?):我也在 C# 的 IDisposeable 中遇到过这个问题。 using block ,就像 Java 的 try-with-resources 结构一样,当我有一些东西要打开、快速做某事并立即关闭时,它是一个很好的特性。但通常情况并非如此,尤其是对于文件,当对该资源的访问暂停一段时间或需要管理多个此类资源时。如果我的问题的答案是“始终使用 try-with-resources block ”,我又陷入困境了。

最佳答案

我有类似的代码,它们不适合包含在 try-with-resources 语句中。我认为这很好,只要您在程序完成后将其关闭即可。

只要确保您考虑到可能发生的任何异常。例如,在我的程序中,有一个 cleanup() 方法在程序关闭时被调用。这会调用 writer.close()。如果有任何异常行为会导致程序关闭,也会调用此方法。

如果这只是一个简单的程序,并且您希望 Writer 在其运行期间处于打开状态,我认为在程序终止...但确保您的资源已关闭是的好习惯,因此我会继续将其添加到您的程序可能关闭的任何地方。

关于java - Java 程序终止时未能关闭文件有什么危害吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35658694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com