ストリームを閉じなかったときに同じ問題(Windows Server 2012 R2)が発生しました。反復されたすべてのファイルは、JVMがシャットダウンされるまで読み取りモードでオープンされていました。しかし、それはMac OS Xでは発生せず、ストリームはFileSystemProvider
とDirectoryStream
というOS依存の実装に依存しているため、問題はOSにも依存する可能性があると私は推測しています。
@Ian McLairdコメントに反しては、ファイル・システム・リソースのタイムリーな処分が必要な場合は、試し-と資源構築物があることを確実にするために使用されるべき
ことFiles.list()
ドキュメントに記載されていますストリームのcloseメソッドは、ストリーム操作が完了した後に呼び出されます。
返されたストリームは、そのJavadocの言うDirectoryStream
、次のとおりです。
A DirectoryStreamは、作成時に開かれ、closeメソッドを呼び出すことによって閉じられています。ディレクトリストリームを閉じると、そのストリームに関連するすべてのリソースが解放されます。ストリームを閉じないと、リソースがリークする可能性があります。
私のソリューションは、アドバイスに従うと
try-with-resources
構文を使用していた
try (Stream<Path> fileListing = Files.list(directoryPath)) {
// use the fileListing stream
}
私は(上記try-with-resources
構文を使用)、正しくストリームを閉じたときに、ファイルハンドルがすぐに解放されました。
File directory = new File("/path/to/dir");
File[] files = directory.listFiles();
if (files != null) { // 'files' can be null if 'directory' "does not denote a directory, or if an I/O error occurs."
// use the 'files' array or convert to a stream:
Stream<File> fileStream = Arrays.stream(files);
}
:あなたはストリームとしてファイルを取得を気にしないか、あなた自身をメモリにファイル全体のリストを読み込むと、ストリームに変換してOKであれば
、あなたはIOのAPIを使用することができます
私はこのファイルロックの問題を経験しませんでした。ただし、どちらのソリューションもネイティブのOS依存コードに依存しているため、使用するすべての環境でテストすることをお勧めします。
「、ファイルごとに1つのファイル記述子が繰り返しに上保持していますあなたはその結論にどうやって来たのですか? – Tunaki
私はこの結論に、 '.list'の結果を反復する前後に、反復の後に' close'を呼び出すこととしないで、JMX(Ubuntu上のOracle Java 8のScala 2.11)を通してファイル記述子を数えることによってその結論に達しました。 – matanster
SparkのカスタムRDDと同じ問題がありました。開いている接続のリストと、最後に開いているすべての接続を閉じるためのclose()メソッドを追加しました。すでにストリーミングされたファイルを閉じるためにイテレータコードを変更することができます。 –