java nio Files.find来计算子目录

时间:2018-04-27 06:41:49

标签: java nio

我期待这段代码使用来自java.nio.File的Java 8的Files#find方法返回当前目录的所有子目录的计数:

public static void main(String[] args) throws IOException {
    List<File> dirs = new LinkedList<File>();
    Files.find(Paths.get("."),
               Integer.MAX_VALUE,
               (path, basicFileAttributes) -> dirs.add(path.toFile()));
    System.out.println(dirs.size());
}

然而,它总是输出0.我的误解在哪里?

3 个答案:

答案 0 :(得分:1)

查看Files#find的文档:第三个参数是用于确定文件是否应包含在返回的流中的函数。您没有在dirs列表中添加任何内容。

尝试使用matcher函数过滤目录:

    List<Path> found = Files.find(start,
            Integer.MAX_VALUE,
            (path, basicFileAttributes) -> path.toFile().isDirectory()).collect(Collectors.toList());

    java.lang.System.out.println(found.size());

答案 1 :(得分:1)

Files.find会返回您尚未消耗的流,因此您传递的lambda将文件添加到未执行的目录中。 应该使用流,尝试以下

`

public static void main(String[] args) throws IOException {

      List<File> dirs = new LinkedList<File>();
      Files.find(Paths.get("."),
             Integer.MAX_VALUE,
            (path, basicFileAttributes) -> 
      dirs.add(path.toFile())).forEach((ignore)->{});

     java.lang.System.out.println( dirs.size() );
}

答案 2 :(得分:-1)

您可以使用File.isDirectory()来计算它们:

static int countSub(File[] directory) {
    int total = 0;
    for (File files : directory) {
        if (files.isDirectory()) {
            total++;
        }
    }
    return total;
}