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 リソースを閉じていることを確認する必要があります。for ループ内で I/O リソースを処理するには、try-with-resources を使用します。ロジックコードも見せてもらえますか?

ああ、きっとあなたも閉じる必要がありDirectoryStreamます。

于 2014-10-13T07:24:01.117 に答える
-1

このエラーは、ファイル関連の操作を頻繁に実行しようとすると発生することがあります。通常、遅延のないループがあります。を追加してみてくださいThread.sleep()

于 2016-07-09T11:18:57.037 に答える