Java删除一定大小的文件

Dev*_*vin 1 java file delete-file

我有一个Java工具,可生成100,000多个文件,我随后在我的流程的"第2步"中使用.由于"第2步"的性质,我不希望任何文件> 1MB.这是我用来删除这些文件的代码:

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

当文件数量相对较小时,这工作正常.但是,当n> 100,000时,由于内存限制,对listFiles()的调用会导致系统崩溃.我知道你可以根据文件类型过滤结果,但有没有办法根据文件大小来做?或者,是否有另一种方法,我可以轻松地根据文件大小进行大批量删除,不会崩溃我的系统?

FWIW,我正在运行RedHat 6.

Nat*_*rot 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();
          }
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

您可能想查看源代码Files#listFiles(FileFilter).至少在我的版本(Java 1.7,Mac OS)中它是通过调用执行Files#list(),然后复制了所有的比赛,这意味着它占用更多的内存比空间Files#list().