Java删除一定大小的文件

时间:2013-03-22 19:57:53

标签: 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();
        }
    }
}

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

FWIW,我正在运行RedHat 6.

4 个答案:

答案 0 :(得分: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()

答案 1 :(得分:3)

您最好的选择是使用收到listFiles()FileFilter版本,请注意,在accept()方法中,您可以在返回File[]之前询问每个文件的大小},并且只包含具有预期大小的文件。这样做的好处是只返回需要删除的文件。

答案 2 :(得分:0)

您可以尝试在File.listFiles中使用FileFilter,它只返回您需要删除的文件。

答案 3 :(得分:0)

使用Apache Commons FileUtils。您可能会觉得有用的方法是FileUtils#iterateFiles(File directory,IOFileFilter fileFilter,IOFileFilter dirFilter)javadoc)。您可以使用IOFileFilterjavadoc),这将允许您指定迭代时要接受的文件的大小。

这可能是在引擎盖下呼叫listFiles()吗?绝对。但是在你尝试之前你不知道:)