首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未关闭。导致“打开的文件太多”错误。

未关闭。导致“打开的文件太多”错误。
EN

Stack Overflow用户
提问于 2016-07-29 06:53:04
回答 1查看 2.3K关注 0票数 11

我正在创建大量用于批处理的临时目录,使用以下内容:

代码语言:javascript
复制
Path tmp = Files.createTempDirectory("tmp-images");

该目录可能包含1-50个图像文件。在使用Apache FileUtils进行处理后,我将删除该目录。

代码语言:javascript
复制
FileUtils.deleteDirectory(tmp.toFile());

该目录被删除,但我遇到了“太多打开的文件”。lsof给了我这个:

代码语言:javascript
复制
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临时目录而不打开文件句柄?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-29 08:34:47

我找到窃听器了。我用过这个:

代码语言:javascript
复制
List<Path> result = Files.list(tmp).collect(Collectors.toList());

这会使目录打开两次!

正确的方法实际上是:

代码语言:javascript
复制
List<Path> result;
try(Stream<Path> stream = Files.list(tmp)){
    result = stream.collect(Collectors.toList());
}

java:

返回的流封装了一个DirectoryStream。如果需要及时处理文件系统资源,则应使用“使用资源进行尝试”结构来确保流操作完成后调用流的关闭方法。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38652295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档