我有一个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.
答案 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)