我创建了一个简单的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服务器吗?
干杯
答案 0 :(得分:4)
依靠finalize
来清理资源是一个坏主意。您(通常)无法控制何时发生垃圾收集以及何时调用finalize
。事实上,JVM甚至根本不保证finalize
将被调用,所以如果由于某种原因它不会被调用,那么你的资源根本就不会被清除。
答案 1 :(得分:1)
不要依赖终结器(这是Effective Java中的一项)。手动调用清理。