Метод Java java.nio.file.Files list()

Java File Java java.nio.file.Files


java.nio.file.Files.list()представляет собой служебный метод, предоставленный в пакете Java NIO (New I/O) для перечисления содержимого каталога. Этот метод возвращаетStream<Path>объект, содержащий все записи (файлы и подкаталоги) в указанном каталоге.

Определение метода

public static Stream<Path> list(Path dir) throws IOException

Параметры метода

параметр dir

  • Type:java.nio.file.Path
  • Описание: Путь к каталогу, содержимое которого нужно вывести
  • Примечания:
    • Если параметр не является каталогом, будет выброшеноNotDirectoryException
    • Путь должен существовать, иначе будет выброшено исключениеNoSuchFileException
    • Если программа не имеет разрешения на чтение каталога, будет выброшено исключениеAccessDeniedException

Возвращаемое значение

Поток

  • Описание: поток, содержащий все записи (файлы и подкаталоги) в каталоге
  • Особенности:
    • Элементами в потоке являютсяPathобъекты.
    • Поток упорядочен по естественному порядку записей в каталоге (обычно сортируется по имени)
    • Поток загружается лениво; фактически он читает содержимое каталога только при обходе
    • Поток должен быть правильно закрыт для освобождения системных ресурсов

Особенности метода

1. Нерекурсивный

list()Метод перечисляет только записи непосредственно в указанном каталоге; он не перечисляет рекурсивно содержимое подкаталогов.

2. Исключает специальные записи

Возвращаемый поток не содержит записей для самого каталога (".") и родительского каталога ("..").

3. Управление ресурсами

Поскольку возвращается Stream, рекомендуется использовать оператор try-with-resources, чтобы гарантировать корректное закрытие потока:

Пример

try (Stream<Path> stream = Files.list(Paths.get("/path/to/dir"))) {
    stream.forEach(System.out::println);
}

Примеры использования

Базовое использование: вывод содержимого каталога

Пример

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 ListDirectoryExample {
    public static void main(String[] args) {
        Path dir = Paths.get("C:/example");
       
        try (Stream<Path> stream = Files.list(dir)) {
            stream.forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Расширенное использование: фильтрация определённых файлов

Пример

try (Stream<Path> stream = Files.list(Paths.get("/projects"))) {
    stream.filter(path -> path.toString().endsWith(".java"))
          .forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

Преобразование в другие коллекции

Пример

try (Stream<Path> stream = Files.list(Paths.get("/images"))) {
    List<Path> imageFiles = stream.collect(Collectors.toList());
    // Обработать собранный список файлов
} catch (IOException e) {
    e.printStackTrace();
}

Обработка исключений

Files.list()Метод может выбрасывать следующие исключения:

  1. NotDirectoryException- Когда путь не является каталогом
  2. NoSuchFileException- Когда каталог не существует
  3. SecurityException- Когда нет разрешения на чтение каталога
  4. IOException- Когда возникают другие ошибки ввода-вывода

Соображения производительности

  1. Ленивая загрузка: Поток загружается лениво; каталог фактически читается только при выполнении терминальной операции (например, forEach)
  2. Потребление ресурсов: Для каталогов, содержащих большое количество файлов, использование потока позволяет избежать одновременной загрузки всех записей в память
  3. Параллельная обработка: Вы можете вызватьparallel()метод для реализации параллельной обработки, но обратите внимание на проблемы потокобезопасности

Сравнение с аналогичными методами

Метод Тип возвращаемого значения Рекурсивность Содержит специальные записи Примечания
Files.list() Stream<Path> нет нет Рекомендуемый, ресурсосберегающий
File.listFiles() File[] нет нет Традиционный метод IO
Files.walk() Stream<Path> Да Да Рекурсивно перечисляет всё содержимое
Files.newDirectoryStream() DirectoryStream<Path> нет нет Нужно закрывать вручную

Лучшие практики

  1. Всегда используйте try-with-resources: убедитесь, что поток правильно закрыт
  2. Обрабатывайте исключения: правильно обрабатывайте возможный IOException
  3. Рассмотрите использование фильтров: отфильтровывайте ненужные записи как можно раньше в операциях потока
  4. Избегайте изменения каталога: не изменяйте его содержимое во время обхода каталога
  5. Учитывайте символические ссылки: по умолчанию символические ссылки отслеживаются, что может привести к циклическим ссылкам

Итог

Files.list()Этот метод — современный способ обработки содержимого каталога в Java NIO, предоставляющий все преимущества Stream API, включая ленивое выполнение, цепочки операций и возможности параллельной обработки. Для простых задач перечисления содержимого каталога он более гибок и эффективен, чем традиционныеFile.listFiles()методы.

Java File Java java.nio.file.Files

Другие расширения