Как получить список файлов в папке
Короткий ответ
Пусть есть папка docs с файлами readme.md, notes.txt и вложенной папкой img. Files.list() возвращает её содержимое без вложенных папок:
void main() throws IOException {
try (Stream<Path> paths = Files.list(Path.of("docs"))) {
paths.map(p -> p.getFileName().toString()).sorted().forEach(IO::println);
}
}Результат:
img
notes.txt
readme.mdПорядок Files.list() не гарантирован, поэтому результат отсортирован.
Только файлы нужного типа
Отфильтруйте обычные файлы с нужным окончанием:
void main() throws IOException {
try (var paths = Files.list(Path.of("docs"))) {
paths.filter(Files::isRegularFile)
.filter(p -> p.toString().endsWith(".txt"))
.forEach(p -> IO.println(p.getFileName()));
}
}Результат:
notes.txtСо всеми вложенными папками
Files.walk() обходит дерево папок рекурсивно:
void main() throws IOException {
Path root = Path.of("docs");
try (var paths = Files.walk(root)) {
paths.filter(Files::isRegularFile)
.map(p -> root.relativize(p).toString().replace('\\', '/'))
.sorted()
.forEach(IO::println);
}
}Результат:
img/logo.png
notes.txt
readme.mdreplace('\\', '/') нужен, чтобы пути выглядели одинаково в Windows и Linux.
Частая ошибка
Не закрыть поток Files.list() или Files.walk(). Они держат папку открытой — всегда используйте try с ресурсами. А для несуществующей папки оба метода выбрасывают исключение:
void main() throws IOException {
try (var paths = Files.list(Path.of("no-such-folder"))) {
paths.forEach(IO::println);
}
}Результат:
Exception in thread "main" java.nio.file.NoSuchFileException: no-such-folderФункции из этого ответа
- Files.list() — Возвращает поток файлов и папок внутри папки (без вложенных). Рекурсивно обходит Files.walk().
- Path.of() — Создаёт объект Path — путь к файлу или папке.