2011-06-23 52 views
0

部署時,當最後確定叫我創建了一個簡單的Java類,如下所示:在Tomcat

我通過內容作爲字節數組和文件名和類的地方創建一個臨時文件。

import java.io.File; 
import java.io.IOException; 

import org.apache.commons.io.FileUtils; 

public class TempFile { 

private byte[] content; 
private File file; 
private String fileName; 

public TempFile(byte[] content, String fileName) 
     throws IOException { 
    this.content = content; 
this.fileName = fileName; 
file = createTempFile(); 
} 

private File createTempFile() 
     throws IOException { 
    String tmpDir = System.getProperty("java.io.tmpdir"); 
    if(!tmpDir.endsWith("/") || !tmpDir.endsWith("\\")) 
     tmpDir += "/"; 
    File tmpfile = new File(tmpDir + createUniqueName()); 
    while(tmpfile.exists()) 
     tmpfile = new File(tmpDir + createUniqueName()); 
    tmpfile.createNewFile(); 
    FileUtils.writeByteArrayToFile(tmpfile, content); 
    return tmpfile; 
} 

@Override 
protected void finalize() throws Throwable { 
    try { 
     if(file.exists() && file.canRead() && file.canWrite()) 
      file.delete(); 
    } catch(Throwable t) { 
     t.printStackTrace(); 
    } finally { 
     super.finalize(); 
    } 
} 

}

我想如果我實現了清理中的finalize法的情況發生時,臨時文件會被自動刪除當對象的GC處置。

我試着調試過這個,但似乎沒有調用finalize方法。

是什麼原因?這可能是因爲我正在部署這個Tomcat服務器?

乾杯

回答

4

依靠finalize來清理資源是一個壞主意。您(通常)無法控制何時發生垃圾回收以及何時調用finalize。實際上,JVM甚至不保證finalize永遠不會被調用,所以如果由於某種原因它不會被調用,那麼您的資源根本不會被清理。

+0

是的,我真正想到使用終結器的唯一原因就是在開發過程中需要進行一些理智檢查。 – Voo

1

不要依賴於終結(這是有效的Java一項)。手動調用清理。