繁体   English   中英

Java程序终止时无法关闭文件是否有任何危害?

[英]Is there any harm in failing to close a file when a Java program terminates?

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

我收集了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; dr如果资源是打开的输出文件,是否需要实现AutoCloseable并调用writer.close() ,并且在程序完成之前,我永远不需要关闭它? 我可以假设JVM和OS(Linux)会自动为我清理内容吗?

奖励(?):我也为此在C#的IDisposeable 当我要打开,快速执行某些操作并立即关闭时, using块就像Java的try-with-resources构造一样,是一个不错的功能。 但是通常情况并非如此,尤其是对于文件,访问该资源的时间会停滞一会儿,或者需要管理多个此类资源时。 如果我的问题的答案是“始终使用try-with-resources块”,我将再次陷入困境。

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

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

如果这只是一个简单的程序,并且您希望Writer在其运行期间一直处于打开状态,那么我认为在程序终止时不关闭它并不是什么大问题……但这是一个好习惯确保您的资源已关闭,因此我将其添加到您的程序可能关闭的任何位置。

您应该始终关闭资源或将它们设置为null,以便Java中的垃圾收集器可以将其拾取。 使用try-with-resource块是让Java在完成处理后自动关闭资源的好方法。 即使在程序运行期间使用它,也要在结束时关闭它,这是一种好的编程习惯。 有人可能会说您不需要,我个人会说就去做,这就是为什么:

“当不再需要流时,请始终使用close()方法将其关闭,或使用try-with-resource语句自动将其关闭。 不关闭流可能会导致输出文件中的数据损坏或其他编程错误。

-Java编程第10版简介,Y。Daniel Liang

如果可能的话,只需在程序结尾处对资源运行.close()方法。

我(现在)认为更好的答案是“取决于” :-)。 Lukas Eder 在此处提供了详细的处理。 另请参阅Lambda EG小组帖子

但是总的来说,一个好主意是在完成使用try-with-resources资源返回操作系统,并始终使用try-with-resources (除非您知道自己在做什么)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM