Метод Java java.nio.file.Files list()
java.nio.file.Files.list()представляет собой служебный метод, предоставленный в пакете Java NIO (New I/O) для перечисления содержимого каталога. Этот метод возвращаетStream<Path>объект, содержащий все записи (файлы и подкаталоги) в указанном каталоге.
Определение метода
Параметры метода
параметр dir
- Type:
java.nio.file.Path - Описание: Путь к каталогу, содержимое которого нужно вывести
- Примечания:
- Если параметр не является каталогом, будет выброшено
NotDirectoryException - Путь должен существовать, иначе будет выброшено исключение
NoSuchFileException - Если программа не имеет разрешения на чтение каталога, будет выброшено исключение
AccessDeniedException
- Если параметр не является каталогом, будет выброшено
Возвращаемое значение
Поток
- Описание: поток, содержащий все записи (файлы и подкаталоги) в каталоге
- Особенности:
- Элементами в потоке являются
Pathобъекты. - Поток упорядочен по естественному порядку записей в каталоге (обычно сортируется по имени)
- Поток загружается лениво; фактически он читает содержимое каталога только при обходе
- Поток должен быть правильно закрыт для освобождения системных ресурсов
- Элементами в потоке являются
Особенности метода
1. Нерекурсивный
list()Метод перечисляет только записи непосредственно в указанном каталоге; он не перечисляет рекурсивно содержимое подкаталогов.
2. Исключает специальные записи
Возвращаемый поток не содержит записей для самого каталога (".") и родительского каталога ("..").
3. Управление ресурсами
Поскольку возвращается Stream, рекомендуется использовать оператор try-with-resources, чтобы гарантировать корректное закрытие потока:
Пример
stream.forEach(System.out::println);
}
Примеры использования
Базовое использование: вывод содержимого каталога
Пример
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();
}
}
}
Расширенное использование: фильтрация определённых файлов
Пример
stream.filter(path -> path.toString().endsWith(".java"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
Преобразование в другие коллекции
Пример
List<Path> imageFiles = stream.collect(Collectors.toList());
// Обработать собранный список файлов
} catch (IOException e) {
e.printStackTrace();
}
Обработка исключений
Files.list()Метод может выбрасывать следующие исключения:
- NotDirectoryException- Когда путь не является каталогом
- NoSuchFileException- Когда каталог не существует
- SecurityException- Когда нет разрешения на чтение каталога
- IOException- Когда возникают другие ошибки ввода-вывода
Соображения производительности
- Ленивая загрузка: Поток загружается лениво; каталог фактически читается только при выполнении терминальной операции (например, forEach)
- Потребление ресурсов: Для каталогов, содержащих большое количество файлов, использование потока позволяет избежать одновременной загрузки всех записей в память
- Параллельная обработка: Вы можете вызвать
parallel()метод для реализации параллельной обработки, но обратите внимание на проблемы потокобезопасности
Сравнение с аналогичными методами
| Метод | Тип возвращаемого значения | Рекурсивность | Содержит специальные записи | Примечания |
|---|---|---|---|---|
Files.list() |
Stream<Path> |
нет | нет | Рекомендуемый, ресурсосберегающий |
File.listFiles() |
File[] |
нет | нет | Традиционный метод IO |
Files.walk() |
Stream<Path> |
Да | Да | Рекурсивно перечисляет всё содержимое |
Files.newDirectoryStream() |
DirectoryStream<Path> |
нет | нет | Нужно закрывать вручную |
Лучшие практики
- Всегда используйте try-with-resources: убедитесь, что поток правильно закрыт
- Обрабатывайте исключения: правильно обрабатывайте возможный IOException
- Рассмотрите использование фильтров: отфильтровывайте ненужные записи как можно раньше в операциях потока
- Избегайте изменения каталога: не изменяйте его содержимое во время обхода каталога
- Учитывайте символические ссылки: по умолчанию символические ссылки отслеживаются, что может привести к циклическим ссылкам
Итог
Files.list()Этот метод — современный способ обработки содержимого каталога в Java NIO, предоставляющий все преимущества Stream API, включая ленивое выполнение, цепочки операций и возможности параллельной обработки. Для простых задач перечисления содержимого каталога он более гибок и эффективен, чем традиционныеFile.listFiles()методы.
Java java.nio.file.Files