Files.walk()
Обходит папку и все вложенные папки и возвращает поток всех найденных путей.
Доступно с: Java 7
Синтаксис
public static Stream<Path> walk(Path start, int maxDepth, FileVisitOption... options)Параметры
| Параметр | Тип | Описание |
|---|---|---|
| start | Path | Папка, с которой начинается обход; она тоже попадает в поток. |
| maxDepth | int | Необязательная глубина: 1 — только содержимое самой папки. |
| options | FileVisitOption... | Необязательно: 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, создание папок и файлов, размер, копирование, перемещение, удаление и список файлов.