Gymterview
junior

Как выбрать все элементы определенного каталога по критерию?

Для выбора файлов по критерию (например, по расширению) используется метод File.listFiles() с передачей фильтра FileFilter или FilenameFilter.

Подход через java.io.File

Пример
File dir = new File("/project/src");

// Через FileFilter — все .java файлы
File[] javaFiles = dir.listFiles(f -> f.isFile() && f.getName().endsWith(".java"));

// Через FilenameFilter — по имени
File[] logs = dir.listFiles((d, name) -> name.endsWith(".log"));

Подход через NIO.2 (рекомендуемый)

Пример
// DirectoryStream с glob-шаблоном
try (DirectoryStream<Path> stream =
        Files.newDirectoryStream(Path.of("/project/src"), "*.java")) {
    for (Path entry : stream) {
        System.out.println(entry.getFileName());
    }
}

// Stream API — Files.list() для одного уровня
try (Stream<Path> stream = Files.list(Path.of("/project/src"))) {
    List<Path> javaFiles = stream
        .filter(Files::isRegularFile)
        .filter(p -> p.toString().endsWith(".java"))
        .collect(Collectors.toList());
}

// Stream API — Files.walk() для рекурсивного обхода
try (Stream<Path> stream = Files.walk(Path.of("/project/src"))) {
    List<Path> allJava = stream
        .filter(p -> p.toString().endsWith(".java"))
        .collect(Collectors.toList());
}

Метод File.listFiles() возвращает только элементы первого уровня каталога. Для рекурсивного обхода в классическом IO требовалась ручная рекурсия, тогда как NIO.2 предоставляет Files.walk() и Files.walkFileTree().

На собеседовании: покажите решение через listFiles(FileFilter) и упомяните более современный подход через NIO.2 (Files.list(), Files.walk()). Обратите внимание на необходимость закрытия Stream через try-with-resources.