仅使用 Java 8 流列出具有一定深度的文件夹

2022-09-04 05:59:05

考虑到Java 8中有“新”流API,我可以用来迭代文件夹。如果使用此方法或深度= 2,我如何才能仅获取给定目录的子文件夹?Files.walk

我目前有这个工作示例,遗憾的是,它还将根路径打印为所有“子文件夹”。

Files.walk(Paths.get("/path/to/stuff/"))
     .forEach(f -> {
        if (Files.isDirectory(f)) {
            System.out.println(f.getName());
        }
     });

因此,我又回到了以下做法。它将文件夹存储在内存中,之后需要处理存储的列表,我会避免使用lambdas。

File[] directories = new File("/your/path/").listFiles(File::isDirectory);

答案 1

要仅列出给定目录的子目录:

Path dir = Paths.get("/path/to/stuff/");
Files.walk(dir, 1)
     .filter(p -> Files.isDirectory(p) && ! p.equals(dir))
     .forEach(p -> System.out.println(p.getFileName()));

答案 2

下面是一个适用于任意且也大于 1 的解决方案。假设和:minDepthmaxDepthminDepth >= 0minDepth <= maxDepth

final int minDepth = 2;
final int maxDepth = 3;
final Path rootPath = Paths.get("/path/to/stuff/");
final int rootPathDepth = rootPath.getNameCount();
Files.walk(rootPath, maxDepth)
        .filter(e -> e.toFile().isDirectory())
        .filter(e -> e.getNameCount() - rootPathDepth >= minDepth)
        .forEach(System.out::println);

要完成您最初在列表问题中提出的问题“...只有一定深度的文件夹...“,只需确保 .minDepth == maxDepth


推荐