何时在tomcat上部署时调用finalize

时间:2011-06-23 12:34:07

标签: java file tomcat io finalize

我创建了一个简单的Java类,如下所示:

我将内容作为字节数组和文件名传递,并且该类在某处创建了一个TempFile。

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-method中实现了清理,那么当GC处理对象时,tempfiles会被自动删除。

我试过调试它,但似乎没有调用finalize方法。

是什么原因?这可能是因为我正在部署这个Tomcat服务器吗?

干杯

2 个答案:

答案 0 :(得分:4)

依靠finalize来清理资源是一个坏主意。您(通常)无法控制何时发生垃圾收集以及何时调用finalize。事实上,JVM甚至根本不保证finalize将被调用,所以如果由于某种原因它不会被调用,那么你的资源根本就不会被清除。

答案 1 :(得分:1)

不要依赖终结器(这是Effective Java中的一项)。手动调用清理。