2017-04-03 95 views
1

我的程序需要臨時文件夾才能在運行時放入數據。該程序退出後不需要該數據,應該刪除。程序的每個運行實例都需要一個文件夾。啓動時刪除臨時文件

如果我使用file.deleteOnExit(),這並不能確保文件在任何類型的崩潰時被刪除。因此,我的想法是在啓動時檢查沒有被刪除的舊臨時文件並將其刪除。但是當啓動另一個程序實例時,它不應該刪除正在運行的程序的臨時文件。我怎樣才能做到這一點?

更具體地說:臨時文件應該在系統的臨時目錄中,如果程序正常退出,應該刪除。這個問題只是該程序崩潰的幾次。該程序必須是獨立於操作系統的。使用Path而不是File類的解決方案是優選的。

回答

0

那麼,我建議在每個應用程序的開始創建一個私人目錄,其中存儲臨時文件說/var/run/myapp/tmp

並在啓動刪除目錄內容:

void purgeDirectory(File dir) { 
    for (File file: dir.listFiles()) { 
     if (file.isDirectory()) purgeDirectory(file); 
     file.delete(); 
    } 
} 

你,依然可以自由刪除在應用程序退出目錄中的內容,但這樣一來,即使在出口處的清理並沒有正確地完成你確定在啓動時有一個空的目錄。

0

如果您需要依賴其他常見資源(如臨時文件),讓您的應用程序具有多個實例通常是一個壞主意。例如,如果您已經有兩個應用程序實例,剛剛打開的第三個應用程序很難判斷它是否是第三個應用程序,以及其他實例是否仍然存在。

正如您所說的,如果JVM崩潰並且Java不能提供自動清理臨時文件的可靠方法,deleteOnExit()將不會清理臨時文件。

所以,我有以下幾點建議:

  • 如果你可以選擇將只有一個應用程序實例使用多個窗口:
    • 你可以有一個固定的位置,當啓動清潔。但是,用這種方法,你可能會放棄Java的一些可移植性。
    • 如果你的應用是GUI應用程序,你可以通過創建Java API的臨時文件,並在關閉主框架等註冊一些清潔行動 - 仍然無法處理一些死機的情況
    • 您可以添加shutdownHook - 仍無法處理一些崩潰情況
  • 如果你堅持要有多個實例並且你的應用程序是GUI應用程序:必須使用Java API來創建臨時文件,並且可能會添加偵聽器或shutdownHook。
+0

由於代碼的設計方式,即使這是一個好主意,也不可能像在您建議的那樣在不同的窗口中從同一進程運行多個實例。 – piegames

+0

@piegames正如我們已經討論過的,在退出時沒有可靠的方法來刪除臨時文件,所以我們必須在啓動時刪除。就我所知,擁有多個實例幾乎會使這項工作無法完成。 – Tony

+0

該程序可以將時間戳放入臨時目錄中的文件中,並在後臺線程中每分鐘更新一次。如果時間戳早於〜5分鐘,則該文件夾可能會被新實例刪除。 – piegames