Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过File.deleteOnExit清除排队等待删除的文件_Java_File_Java Io - Fatal编程技术网

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

Java 通过File.deleteOnExit清除排队等待删除的文件,java,file,java-io,Java,File,Java Io,我有一些有用的。由于这段代码在我的应用程序中被大量调用,内存不断堆积。这会导致堆无限增长,最终导致OutOfMemoryErrors。由于该类是完全受包保护的,所以似乎有一种简单的机制来中间删除排队等待删除的文件。我可以用一些反射魔法来清空这个列表吗?据我所知,你需要一个肮脏的黑客,所以这应该足够了。您需要恢复文件字段值,以便正常关机(或下次使用此黑客)正常工作 注意:将删除所有内容,包括其他库计划的文件。一定要检查你的箱子是否安全 java.lang.reflect.Method r

我有一些有用的。由于这段代码在我的应用程序中被大量调用,内存不断堆积。这会导致堆无限增长,最终导致
OutOfMemoryErrors
。由于该类是完全受包保护的,所以似乎有一种简单的机制来中间删除排队等待删除的文件。我可以用一些反射魔法来清空这个列表吗?

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

注意:将删除所有内容,包括其他库计划的文件。一定要检查你的箱子是否安全

    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> ());

迭代集合并手动删除文件,同时从集合中删除名称。通过这种方式,您可以自行决定删除哪些文件。

阅读一段之后,
deleteOnExit()
似乎是一种非常奇怪且部分危险的方法。它将只存储“正常终止”时要删除的文件字符串,这很可能是
System.exit(0)
。对于任何其他终端,如硬关机或
终止
甚至
系统退出(1)
,文件都不会被删除。所以我会尽量避免使用
deleteOnExit()
。你能用另一个库来替换使用过的库,而不使用那种方法吗?实际上,您可以使用反射来更改可见性,并用一个简单的
delete
来覆盖该方法。或者,最可能不太方便的方法是,打开库,重写该代码,自己构建它。(也许会创建一个拉请求?)我愿意在那里提交一个补丁,但它可能需要很长时间才能被合并,一个解决方法黑客会很好呵呵。
    files.get (null)