Метод walk
Метод walk класса Files рекурсивно обходит
все файлы и каталоги, начиная с указанного пути,
и возвращает поток Stream с объектами Path.
В первом параметре мы передаем начальный путь,
во втором - опции обхода (например, FOLLOW_LINKS),
а в третьем - максимальную глубину обхода.
Параметры опций и глубины являются необязательными.
По умолчанию обход идет на неограниченную глубину.
Важно закрывать поток после использования,
поэтому метод удобно вызывать внутри try-with-resources.
Синтаксис
Files.walk(start, [options], [maxDepth])
Пример
Давайте обойдем каталог и выведем все пути в консоль:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args) throws IOException
{
Path start = Path.of(".");
try (Stream<Path> stream = Files.walk(start))
{
stream.forEach(System.out::println);
}
}
}
Результат выполнения кода:
.
./Main.java
./src
./src/Test.java
Пример
Давайте ограничим глубину обхода двумя уровнями:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args) throws IOException
{
Path start = Path.of(".");
try (Stream<Path> stream = Files.walk(start, 2))
{
stream.forEach(System.out::println);
}
}
}
Результат выполнения кода:
.
./Main.java
./src
./src/Test.java
Пример
Давайте отфильтруем только обычные файлы с расширением .java:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args) throws IOException
{
Path start = Path.of(".");
try (Stream<Path> stream = Files.walk(start))
{
stream
.filter(Files::isRegularFile)
.filter(p -> p.toString().endsWith(".java"))
.forEach(System.out::println);
}
}
}
Результат выполнения кода:
./Main.java
./src/Test.java
Пример
Давайте подсчитаем количество файлов и каталогов в дереве:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args) throws IOException
{
Path start = Path.of(".");
try (Stream<Path> stream = Files.walk(start))
{
long res = stream.count();
System.out.println(res);
}
}
}
Результат выполнения кода:
4
Смотрите также
-
класс
Files,
который содержит методы для работы с файлами -
метод
list,
который возвращает список файлов в каталоге -
метод
find,
который ищет файлы по заданному условию -
метод
isDirectory,
который проверяет, является ли путь каталогом