1

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

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

一段时间后,我收到此错误

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

看起来这个循环正在打开文件而不关闭它们。每次循环运行后有什么方法可以关闭文件吗?

4

3 回答 3

3

根据 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();
于 2014-10-13T07:22:45.250 回答
2

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

哦,你肯定也需要关闭DirectoryStream

于 2014-10-13T07:24:01.117 回答
-1

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

于 2016-07-09T11:18:57.037 回答