簡體   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