我有一个ImageWrapper
类可以将图像保存到磁盘中的临时文件中,以释放堆内存,并允许在需要时重新加载它们。
class ImageWrapper {
File tempFile;
public ImageWrapper(BufferedImage img) {
// save image to tempFile and gc()
}
public BufferedImage getImage() {
// read the image from tempFile and return it.
}
public void delete() {
// delete image from disk.
}
}
我担心的是,当这样的实例被垃圾收集时,如何确保文件被删除ImageWrapper
(否则我可能会用不需要的图像填充磁盘)。这必须在应用程序仍在运行时完成(与终止期间的清理建议相反),因为它可能会运行很长时间。
我对 java 的 GC 概念并不完全熟悉,我想知道这是否finalize()
是我正在寻找的。finalize()
我的想法是从被覆盖的方法中调用 delete() (就此而言,在单独的线程上) 。这是正确的方法吗?
更新:
我认为我不能close()
像许多用户所建议的那样使用对象,因为每个这样的图像都被提取到我无法控制的侦听器列表中,并且可能会保存对该对象的引用。我确定能够删除文件的唯一时间是没有引用,因此我认为finalize()
是正确的方法。有什么建议么?
更新 2:
哪些场景finalize()
不会被调用?如果唯一的可能是退出程序(以预期/意外的方式),我可以接受它,因为这意味着我只冒着没有删除一个不需要的临时文件的风险(退出期间处理的那个)。