代码之家  ›  专栏  ›  技术社区  ›  lony

仅使用Java 8流仅列出某个深度的文件夹

  •  2
  • lony  · 技术社区  · 6 年前

    考虑到有“新的” streams API 在Java 8中,我可以使用 Files.walk 循环访问文件夹。如果使用此方法或深度=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);
    
    5 回复  |  直到 5 年前
        1
  •  4
  •   Andreas LppEdd    6 年前

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

    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
  •   kira    6 年前

    同意Andreas Answeru也可以使用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()));
    
        3
  •  1
  •   marsouf    6 年前

    您可以利用 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);
    
        4
  •  1
  •   L. Holanda    5 年前

    这里有一个解决方案可以处理任意 minDepth maxDepth 也大于1。假设 minDepth >= 0 minDepth <= 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 .

        5
  •  0
  •   GolamMazid Sajib    6 年前

    您也可以尝试以下操作:

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