【发布时间】:2021-03-19 07:41:56
【问题描述】:
我需要编写一个需要遍历路径并执行一些逻辑的 cronJob。这段代码是我的起点:
try(Stream<Path> walk = Files.walk(rootPath, FileVisitOption.FOLLOW_LINKS)){
walk.sorted(Comparator.reverseOrder()).map(Path::toFile).peek(System.out::println).forEach(System.out::println);
}catch (IOException e){
e.printStackTrace();
}
我需要做的是: 我拿文件,验证他的名字,如果他的名字有特定的模式,我需要删除他。我想在不创建列表的情况下执行此操作,因为我的文件夹可以是 200-300 GB 大。我的问题是:我可以为每个文件实现一些自定义逻辑,例如,一个将文件或他的全名做一些逻辑并继续下一个文件的方法吗? 例如:.forEach(customMethod(fileName))
【问题讨论】:
-
FileVisitor和Files#walkFileTree可能更适合您。 -
“我想在不创建列表的情况下执行此操作,因为我的文件夹可以是 200-300 GB 大。” - 请注意,文件的数量不一定与它们的大小相对应,
File不包含文件内容,但只是对文件的引用(甚至可能还不存在)。所以我假设你的 300GB 目录不会有那么多文件,除非它都是只有几千字节的小文件。 -
@Thomas 都是小文件,可能有几十万个文件。
-
是只有一个目录,还是有子目录?是否绝对有必要对文件进行排序?请注意,我相信您使用
sorted会导致所有文件(路径,而不是内容)被缓冲到内存中。 -
@Slaw 该文件夹包含文件和带有文件的子目录