Метод find
Метод find класса Files выполняет обход дерева файловой системы, начиная с заданного начального пути, и возвращает поток Stream<Path>, содержащий все файлы и директории, которые удовлетворяют заданным условиям. В первый параметр мы передаем начальный путь (объект Path), с которого начинается поиск. Во второй параметр мы передаем максимальную глубину обхода (целое число). В третий параметр мы передаем один или несколько объектов BiPredicate<Path, BasicFileAttributes> - условия, которым должны соответствовать найденные элементы. Также можно указать опции обхода через FileVisitOption. Метод возвращает ленивый поток, поэтому обход файловой системы выполняется по мере обработки потока.
Синтаксис
Files.find(start, maxDepth, matcher, options)
Пример
Давайте найдем все обычные файлы в текущей директории с глубиной обхода 1 и выведем их на экран:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args) throws IOException
{
Path start = Paths.get(".");
try (Stream<Path> stream = Files.find(
start,
1,
(path, attrs) -> attrs.isRegularFile()
)) {
stream.forEach(System.out::println);
}
}
}
Результат выполнения кода:
./Main.java
./README.md
Пример
Давайте найдем все файлы с расширением .txt на глубине до 2 уровней и выведем их количество:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args) throws IOException
{
Path start = Paths.get(".");
try (Stream<Path> stream = Files.find(
start,
2,
(path, attrs) -> path.toString().endsWith(".txt")
)) {
List<Path> res = stream.collect(Collectors.toList());
System.out.println(res);
}
}
}
Результат выполнения кода:
[./docs/notes.txt, ./logs/error.txt]
Пример
Давайте найдем все директории на глубине до 1 уровня, начиная с текущего каталога:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args) throws IOException
{
Path start = Paths.get(".");
try (Stream<Path> stream = Files.find(
start,
1,
(path, attrs) -> attrs.isDirectory()
)) {
List<Path> res = stream.collect(Collectors.toList());
System.out.println(res);
}
}
}
Результат выполнения кода:
[./src, ./docs, ./logs]
Смотрите также
-
класс
Files,
который предоставляет методы для работы с файлами -
метод
walk,
который обходит дерево файлов -
метод
list,
который возвращает содержимое директории -
метод
isRegularFile,
который проверяет, является ли файл обычным