2011-06-28 48 views
2

我目前有一個tomcat webapp,當JVM正在關閉時需要刪除文件。我創建了一個自定義的ContextLoaderListener來處理contextDestroyed事件。在這裏我調用相應文件的deleteOnExit。但是,自從jdk 1.6.0_14我無法刪除OnExit。谷歌搜索表示有一個預期的變化,但我沒有看到這方面的工作。有人有主意嗎?DeleteOnExit jvm shutdown

下面的代碼不起作用。

for(File f : myFileList) 
try{ 
    f.deleteOnExit() 
} finally { 
    f.delete() 
} 
+0

無論虛擬機正常終止,是否發生這種情況?另外,請確保關閉文件上的所有句柄。 – mre

+1

請注意,當您創建文件時,通常會調用File.deleteOnExit,而不是在關閉處理程序中。重點是,當系統退出時(請按順序)請求刪除文件。 – sudocode

+2

deleteOnExit是不好的,泄漏,甚至可能會刪除一個不同於你預期的文件。總之:不要使用它。 (並且'finally'部分大量刪除文件,你不會得到更好的結果) – bestsss

回答

5

我不認爲你會很高興清理文件的結果作爲有序關閉過程的一部分。例如,如果你的進程崩潰或者以「kill -9」停止,那麼你的清理代碼將不會運行。

更可靠的方法是在啓動/初始化期間設置環境。如果您將此應用程序的文件分離到特定的目錄中,則很容易:只有empty the directory存在問題。

「空目錄」調用所屬的確切位置取決於您的應用程序。例如,如果您編寫了一個servlet,請使用the init method。或者,如果您使用Spring,那麼它們會提供各種初始化掛鉤,例如init-method

+0

您何時建議清空相關目錄?另外,您建議清空目錄的方法是什麼?他們已經分離到他們自己的目錄中。如果我們的進程崩潰或者kill -9被調用,那麼轉到目錄並清空它是我們最擔心的問題。在正常的日常操作中,我們可能在我們的開發環境中部署4-5次代碼,因此如果沒有適當的清理步驟,它會變得非常麻煩。 – Joseph

+2

在初始化寫入文件的資源時,我會在啓動時清空目錄。與啓動掛鉤將會非常可靠,掛鉤進入關閉狀態本質上是不可靠的。 – werkshy