java nio Files.find для подсчета подкаталогов - PullRequest
0 голосов
/ 27 апреля 2018

Я ожидал, что этот код с помощью метода Files # find в Java 8 из java.nio.File вернет счетчик всех подкаталогов текущего каталога:

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 голосов
/ 27 апреля 2018

Посмотрите документы 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());
0 голосов
/ 27 апреля 2018

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())).forEach((ignore)->{});

     java.lang.System.out.println( dirs.size() );
}
0 голосов
/ 27 апреля 2018

Вы можете использовать File.isDirectory() для их подсчета:

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