【问题标题】:Implement custom logic when traversing path using Stream<Path>使用 Stream<Path> 遍历路径时实现自定义逻辑
【发布时间】: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))

【问题讨论】:

  • FileVisitorFiles#walkFileTree 可能更适合您。
  • “我想在不创建列表的情况下执行此操作,因为我的文件夹可以是 200-300 GB 大。” - 请注意,文件的数量不一定与它们的大小相对应,File 不包含文件内容,但只是对文件的引用(甚至可能还不存在)。所以我假设你的 300GB 目录不会有那么多文件,除非它都是只有几千字节的小文件。
  • @Thomas 都是小文件,可能有几十万个文件。
  • 是只有一个目录,还是有子目录?是否绝对有必要对文件进行排序?请注意,我相信您使用 sorted 会导致所有文件(路径,而不是内容)被缓冲到内存中。
  • @Slaw 该文件夹包含文件和带有文件的子目录

标签: java stream nio


【解决方案1】:

我是这样解决的:

private static void deleteOrphanedMediaFilesUsingStreamEXAMPLE(final String path) throws IOException{
    Path dir = Paths.get(path);
    Stream<Path> walk = Files.walk(dir, FileVisitOption.FOLLOW_LINKS);

    walk.sorted(Comparator.reverseOrder()).forEach(path1 -> {
        String name = path1.getFileName().toString();
        //logic
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多