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

时间:2017-12-13 12:10:45

标签: java file java-io

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

1 个答案:

答案 0 :(得分:1)

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

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

    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)

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

相关问题