java - 通过 File.deleteOnExit 清理排队等待删除的文件

标签 java file java-io

我有一些library code使用 File.deleteOnExit() 。由于这段代码在我的应用程序中被多次调用,内存不断堆积在 DeleteOnExitHook 中。 。这会导致我的堆无限增长并最终导致 OutOfMemoryErrors。由于该类完全受到包保护,因此似乎有一种简单的机制可以中间删除排队等待删除的文件。我可以用一些反射魔法把这个列表清空吗?

最佳答案

据我所知,你需要一个肮脏的黑客,所以这应该足够了。您需要恢复 files 字段值,以便正常关闭(或下次使用此黑客时)正常工作。

注意:将删除所有内容,包括其他库安排的文件。请务必检查它在您的情况下是否安全。

    java.lang.reflect.Method  run   = Class.forName ("java.io.DeleteOnExitHook").getDeclaredMethod ("runHooks");
    java.lang.reflect.Field   files = Class.forName ("java.io.DeleteOnExitHook").getDeclaredField  ("files");

    run.setAccessible (true);
    files.setAccessible (true);

    run.invoke (null);
    files.set (null, new java.util.LinkedHashSet <String> ());

或者,只需检索计划的文件

    files.get (null)

迭代集合并手动删除文件,同时从集合中删除名称。这样您就可以决定自己删除哪些文件。

关于java - 通过 File.deleteOnExit 清理排队等待删除的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47792708/

相关文章:

c# - 如何确保我下载的文件已经完成?

将长数组转换为字节数组的Java native 方法

java - Java 中的 Windows 临时文件

java - 在 Linux 服务器的后台运行 Java 应用程序

java - 使用 Java 检测互联网连接

java - 黑莓 Eclipse 显示设备文件夹

cocoa - 如何在 cocoa 应用程序中存储文件然后稍后访问它以加密

regex - 使用正则表达式查找多个文件扩展名的命令

java - BufferedWriter 没有写入 ByteArrayOutputStream

java - 存储JSON对象: SQLite vs serialization to disk