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

时间:2018-07-26 06:41:07

标签: java java-8 directory traversal

考虑到Java 8中存在“新” streams API,我可以使用Files.walk遍历文件夹。如果使用此方法或depth = 2,如何只获取给定目录的子文件夹?

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

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

因此,我恢复为以下approach。哪个将文件夹存储在内存中,然后需要处理存储的列表,我会避免使用lambda代替。

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

6 个答案:

答案 0 :(得分:4)

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

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()));

答案 1 :(得分:1)

同意Andreas的回答,您还可以使用Files.list代替Files.walk

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

答案 2 :(得分:1)

您可以利用Files#walk方法的第二次重载来显式设置最大深度。跳过流的第一个元素以忽略根路径,然后可以仅过滤目录以最终打印每个目录。

final Path root = Paths.get("<your root path here>");

final int maxDepth = <your max depth here>;

Files.walk(root, maxDepth)
    .skip(1)
    .filter(Files::isDirectory)
    .map(Path::getFileName)
    .forEach(System.out::println);

答案 3 :(得分:1)

这里是一种解决方案,可与任意大于1的minDepthmaxDepth一起使用。假设minDepth >= 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

答案 4 :(得分:1)

public List<String> listFilesInDirectory(String dir, int depth) throws IOException {
    try (Stream<Path> stream = Files.walk(Paths.get(dir), depth)) {
        return stream
                .filter(file -> !Files.isDirectory(file))
                .map(Path::getFileName)
                .map(Path::toString)
                .collect(Collectors.toList());
    }
}

答案 5 :(得分:0)

您也可以尝试以下操作:

private File getSubdirectory(File file){
    try {
        return new File(file.getAbsolutePath().substring(file.getParent().length()));
    }catch (Exception ex){

    }
    return null;
}

收集文件

File[] directories = Arrays.stream(new File("/path/to/stuff")
          .listFiles(File::isDirectory)).map(Main::getSubdirectory)
                                        .toArray(File[]::new);