我使用以下方法为批处理创建了许多临时目录:
Path tmp = Files.createTempDirectory("tmp-images");
目录可能包含1-50个图像文件。我在使用Apache FileUtils
处理后删除目录:
FileUtils.deleteDirectory(tmp.toFile());
该目录已删除,但我遇到了太多打开的文件"。 lsof
正在给我这个:
java DIR 253,0 6 136899239 /opt/tomcat/temp/tmp-images1570439806870910607 (deleted)
java DIR 253,0 6 136899237 /opt/tomcat/temp/tmp-images2456811184361231168 (deleted)
java DIR 253,0 6 136899237 /opt/tomcat/temp/tmp-images2456811184361231168 (deleted)
java DIR 253,0 6 136899238 /opt/tomcat/temp/tmp-images8109733179118089091 (deleted)
java DIR 253,0 6 69527104 /opt/tomcat/temp/tmp-images8763413559313243911 (deleted)
java DIR 253,0 6 136927313 /opt/tomcat/temp/tmp-images8168355305097994981 (deleted)
如何在没有打开文件句柄的情况下删除nio2临时目录?
答案 0 :(得分:10)
我发现了这个错误。我用过这个:
List<Path> result = Files.list(tmp).collect(Collectors.toList());
这使目录OPEN两次!
正确的方法实际上就是这样:
List<Path> result;
try(Stream<Path> stream= Files.list(tmp)){
result=stream.collect(Collectors.toList());
}
java doc:
返回的流封装了DirectoryStream。如果需要及时处理文件系统资源,则应使用try-with-resources构造来确保在流操作完成后调用流的close方法。