1

プロセスの「ステップ 2」で後で使用する 100,000 以上のファイルを生成する Java ツールがあります。「ステップ 2」の性質上、1 MB を超えるファイルは必要ありません。これらのファイルを削除するために使用していたコードは次のとおりです。

File[] files = root.listFiles();
for (File file : files) {
    if (file.isFile()) {
        if (file.length > 1048576) { //size of MB
            //delete the file
            file.delete();
        }
    }
}

ファイルの数が比較的少ない場合、これはうまく機能していました。ただし、n > 100,000 の場合、listFiles() を呼び出すと、メモリの制約によりシステムがクラッシュします。ファイルの種類に基づいて結果をフィルター処理できることは知っていますが、ファイル サイズに基づいてフィルター処理を行う方法はありますか? または、システムをクラッシュさせずに、ファイル サイズに基づいて大量のバッチを簡単に削除できる別の方法はありますか?

FWIW、RedHat 6 を実行しています。

4

4 に答える 4

5

DirectoryStreamを見るべきだと思います。ご想像のとおり、ディレクトリの内容をストリーム形式で反復処理できるため、大きなディレクトリからメモリが不足することはありません。

try (DirectoryStream<Path> stream = Files.newDirectoryStream(dirPath)) {
   for (Path entry : stream) {
       File file = entry.toFile();
       if (file.isFile()) {
          if (file.length > 1048576) { //size of MB
             //delete the file
             file.delete();
          }
       }
   }
}

のソース コードを参照してくださいFiles#listFiles(FileFilter)。少なくとも私のバージョン (Java 1.7、Mac OS) では、Files#list()すべての一致を呼び出してからコピーすることで実装されてますFiles#list()

于 2013-03-22T20:10:07.500 に答える
3

あなたの最善の策は、listFiles()を受け取るバージョンの を使用するFileFilterことです。accept()メソッドでは、 を返す前に各ファイルのサイズを尋ねることができFile[]、予想されるサイズのファイルのみを含めることができます。これには、削除する必要のあるファイルのみが返されるという利点があります。

于 2013-03-22T20:01:43.797 に答える
0

Apache Commons FileUtilsを使用します。役に立つと思われるメソッドはFileUtils#iterateFiles(File directory,IOFileFilter fileFilter,IOFileFilter dirFilter)( javadoc ) です。IOFileFilter( javadoc ) を使用すると、反復中に受け入れるファイルのサイズを指定できます。

これは内部で呼び出している可能性がありlistFiles()ますか? 絶対。ただし、試してみるまでわかりません:)

于 2013-03-22T20:09:02.640 に答える
0

削除する必要があるファイルのみを返す File.listFiles で FileFilter を使用することができます。

于 2013-03-22T20:02:21.377 に答える