Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как получить список файлов в папке

Короткий ответ

Пусть есть папка 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.md

replace('\\', '/') нужен, чтобы пути выглядели одинаково в 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 — путь к файлу или папке.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.