Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

Files.walk()

Обходит папку и все вложенные папки и возвращает поток всех найденных путей.

Доступно с: Java 7

Синтаксис

public static Stream<Path> walk(Path start, int maxDepth, FileVisitOption... options)

Параметры

ПараметрТипОписание
startPathПапка, с которой начинается обход; она тоже попадает в поток.
maxDepthintНеобязательная глубина: 1 — только содержимое самой папки.
optionsFileVisitOption...Необязательно: FOLLOW_LINKS, чтобы переходить по символическим ссылкам.

Возвращаемое значение

Stream<Path>Ленивый поток путей, который нужно закрыть.

Примеры

Всё дерево папки. Пути показаны относительно корня; replace нужен только для одинакового вывода в Windows:

void main() throws IOException {
    Path root = Files.createTempDirectory("demo");
    Files.createDirectories(root.resolve("src/app"));
    Files.writeString(root.resolve("README.md"), "hi");
    Files.writeString(root.resolve("src/app/Main.java"), "class Main {}");
 
    try (Stream<Path> paths = Files.walk(root)) {
        paths.filter(p -> !p.equals(root))
            .map(p -> root.relativize(p).toString().replace('\\', '/'))
            .sorted()
            .forEach(IO::println);
    }
}

Результат:

README.md
src
src/app
src/app/Main.java

Подсчёт файлов .java и ограничение глубины:

void main() throws IOException {
    Path root = Files.createTempDirectory("demo");
    Files.createDirectories(root.resolve("a/b"));
    Files.writeString(root.resolve("a/One.java"), "");
    Files.writeString(root.resolve("a/b/Two.java"), "");
    Files.writeString(root.resolve("a/b/notes.txt"), "");
 
    try (Stream<Path> paths = Files.walk(root)) {
        IO.println(paths.filter(p -> p.toString().endsWith(".java")).count());
    }
    try (Stream<Path> paths = Files.walk(root, 1)) {
        IO.println(paths.count());
    }
}

Результат:

2
2

Примечания

Обход идёт в глубину, порядок внутри папки зависит от системы — сортируйте сами. Поток держит папки открытыми, поэтому всегда используйте try с ресурсами. Если к какой-то папке нет доступа, весь обход прерывается с UncheckedIOException. Для поиска по условию есть Files.find(start, depth, (path, attrs) -> ...), а только содержимое одной папки возвращает Files.list().

См. также

  • Files.list() — Возвращает поток файлов и папок внутри папки (без вложенных). Рекурсивно обходит Files.walk().
  • Path.of() — Создаёт объект Path — путь к файлу или папке.
  • Files.exists() — Проверяет, существует ли файл или папка. Рядом — isDirectory(), isRegularFile(), size().
  • try-with-resources — Блок `try`, который сам закрывает открытые ресурсы — файлы, соединения, потоки.

В учебнике

  • Файлы и пути — Работа с файловой системой в Java — Path, Files.exists, создание папок и файлов, размер, копирование, перемещение, удаление и список файлов.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.