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.