在我的情况下使用finalize()?

Eli*_*ist 4 java garbage-collection finalizer

我有一个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.
    }
}
Run Code Online (Sandbox Code Playgroud)

我关注的是,如何确保文件在ImageWrapper垃圾收集时被删除(否则我冒着用不需要的图像填充磁盘的风险).这必须在应用程序仍在运行时完成(而不是终止时的清理建议),因为它可能会长时间运行.

我不完全熟悉java的GC概念,我想知道finalize()我是否正在寻找.我的想法是从override finalize()方法调用delete()(在一个单独的Thread上).这是正确的方法吗?

更新:

close()由于每个这样的图像被提取到我无法控制的侦听器列表,并且可能保存对该对象的引用,因此我认为我不能像许多用户所建议的那样使用该对象.我确定能够删除文件的唯一时间是没有引用,因此我认为finalize()是正确的方法.有什么建议?

更新2:

什么是finalize()不会被调用的场景?如果唯一可能的是退出程序(以预期/意外的方式),我可以接受它,因为这意味着我只冒一个不需要的临时文件(在退出期间处理的文件).

Bri*_*new 6

另一种方法是使用File.deleteOnExit(),它标记JVM在退出时要删除的文件.我意识到这不是你找什么,但可能会感兴趣.

要清楚,如果您的JVM意外死亡,它将不会清除这些文件.因此,您可能希望构建解决方案以在启动时清除缓存文件,这样您就不会随着时间的推移而构建大量未使用的缓存文件.