java.nio.file.FileSystemException:/ proc:打开的文件过多

时间:2014-10-13 06:53:53

标签: java java-7 try-with-resources nio2

我使用此代码读取proc文件系统中的所有文件夹

for (Path processPath : 
        Files.newDirectoryStream(FileSystems.getDefault().getPath("/proc"), "[0-9]*"))
    {
       // Some logic                 
    }

一段时间后我收到此错误

java.nio.file.FileSystemException: /proc: Too many open files

看起来这个循环正在打开文件而不关闭它们。有没有办法在每个循环运行后关闭文件?

3 个答案:

答案 0 :(得分:1)

根据oracle Javadoc: http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#newDirectoryStream(java.nio.file.Path)

当不使用try-with-resources构造时,应在迭代完成后调用目录流的close方法,以释放为打开目录保留的任何资源。你做错了是在for循环中调用newDirectoryStream,所以你不能使用它的方法。

我只想,你应该这样做(如果你不想使用try-with-resources):

        DirectoryStream<Path> dirStream = Files.newDirectoryStream(FileSystems.getDefault().getPath("/proc"), "[0-9]*");
    for (Path processPath : dirStream)
    {
       // your logic                
    }   
    dirStream.close();

答案 1 :(得分:1)

正如彼得所说,你的逻辑看起来像是有问题。您必须确保在每次迭代时关闭I / O资源。使用try-with-resources来处理for循环中的I / O资源。你能告诉你逻辑代码吗?

哦,你当然也需要关闭DirectoryStream

答案 2 :(得分:-1)

当您尝试过于频繁地执行某些与文件相关的操作时,可能会发生此错误。通常有一个没有延迟的循环。尝试添加Thread.sleep()