Навигация по каталогам в Java
16 июля 2023 г.Каталог — это организационная структура файловой системы, которая содержит файлы и другие каталоги. Java предоставляет несколько способов обхода каталога, в зависимости от используемой версии, в том числе:
- Использование метода listFiles() класса File
Использование DirectoryStream в Java 7 и выше
Использование статического метода Files.list() в Java 8 и более поздних версиях
Использование метода walk() в Java 8 и более поздних версиях
Этот учебник по программированию продемонстрирует, как использовать каждый из вышеперечисленных методов для навигации по структуре каталогов в Java.
ПОСМОТРЕТЬ: Лучшие IDE для Java
Метод File listFiles() в Java
listFiles() — это метод экземпляра класса java.io.File. Чтобы использовать его, все, что нужно сделать разработчику, — это создать экземпляр нового объекта File, указав путь к конструктору, а затем вызвать для него listFiles(). listFiles() возвращает массив объектов File, которые программисты могут затем перебирать, чтобы получить дополнительную информацию об отдельных файлах и/или выполнить над ними операции. Вот простой пример, в котором перечислены все файлы и каталоги в папке Windows «C:\My Documents»:
пакет com.developer;
импортировать java.io.File;
открытый класс ListFilesExample {
public static void main(String[] args) {
// Сохраняем имена файлов и каталогов
// в массиве файлов.
// Не забудьте экранировать символ обратной косой черты!
File[] files = new File("C:\\My Documents").listFiles();
// Проходим по массиву файлов
для (Файл файл : файлы) {
// Если подкаталог найден,
// вывести имя подкаталога
если (файл.isDirectory()) {
System.out.println("Каталог: " + file.getName());
}
еще {
// Печатаем имя файла
System.out.println("Файл: " + file.getName());
}
}
}
}Вот частичный список найденных каталогов и файлов:
Справочник: ААМС Каталог: Захватывающие барабаны Каталог: Угловой Каталог: angular-starter Каталог: Любой конвертер видео Каталог: статьи Файл: Аватар — Дом Вечной Охоты — transposed.tg Файл: Avatar - House Of Eternal Hunt.tg Файл: Avatar - Legend Of The King.tg Каталог: bgfx
Рекурсивный обход каталога в Java
Поскольку мы можем тестировать каталоги, мы можем переместить наш цикл for в отдельный метод, который мы можем вызывать рекурсивно для вывода списка файлов подкаталогов, а также тот, который предоставлен нашему методу, как показано в следующем примере кода Java:
пакет com.developer;
импортировать java.io.File;
открытый класс RecursiveListFilesExample {
public static void main(String[] args) {
listFilesInDirectory(новый файл("C:\\Мои документы"));
}
private static void listFilesInDirectory(File dirPath) {
File filesList[] = dirPath.listFiles();
// Проходим по массиву файлов
for (Файл файл : список файлов) {
// Если подкаталог найден,
// вывести имя подкаталога
если (файл.isDirectory()) {
System.out.println("Каталог: " + file.getName());
списокФайловВКаталоге(файл);
}
еще {
// Печать имени файла, присутствующего в заданном пути
System.out.println("Файл: " + file.getName());
}
}
}
}Мы видим в выводе программы, что теперь она также перечисляет файлы подкаталогов:
Справочник: ААМС Файл: AAMS V3 Manual.pdf Файл: AAMS V4 Setup.exe Файл: AAMS.xml Файл: Лицензия.txt Файл: Version.txt Каталог: Захватывающие барабаны Каталог: Настройки Файл: MidifileDatabaseCache.dat Файл: Recent.dat
ПОСМОТРЕТЬ: Лучшие онлайн-курсы по Java для изучения Java
Использование DirectoryStream для циклического просмотра файлов с помощью Java
Java 7 представила альтернативу listFiles() под названием DirectoryStream. Он хорошо работает с конструкцией for-each, позволяя нам перебирать содержимое каталога вместо того, чтобы читать все сразу.
В приведенном ниже примере кода показано, как использовать DirectoryStream Java в методе для вывода списка файлов каталога:
public SetlistFilesUsingDirectoryStream(String dir) выдает IOException { Set fileSet = new HashSet<>(); try (DirectoryStream поток = Files.newDirectoryStream(Paths.get(dir))) { для (Путь путь: поток) { если (!Files.isDirectory(путь)) { fileSet.add(path.getFileName() .нанизывать()); } } } вернуть набор файлов; }
Выше мы позволили Java обрабатывать закрытие ресурса DirectoryStream с помощью конструкции try-with-resources. Мы можем использовать статический метод Files.isDirectory(path) для фильтрации каталогов и возврата набора файлов в папке.
Использование статического метода Files.list()
В Java 8 появился новый метод list() в java.nio.file.Files. Метод списка возвращает лениво заполненный поток записей в каталоге. Таким образом, он более эффективен для обработки больших папок. Вот метод, который возвращает набор имен файлов:
public SetlistFilesUsingFilesList(String dir) выдает IOException { try (Stream stream = Files.list(Paths.get(dir))) { обратный поток .filter(файл -> !Files.isDirectory(файл)) .map(Путь::getFileName) .map(Путь::toString) .collect(Коллекторы.toSet()); } }
Хотя приведенный выше код может выглядеть аналогично listFiles(), он отличается тем, как разработчики получают путь к каждому файлу.
Опять же, мы создали поток, используя конструкцию try-with-resources, чтобы гарантировать, что ресурс каталога будет закрыт после чтения потока.
Как пройтись по содержимому каталога в Java
Метод walk() возвращает Stream, обходя дерево файлов, начиная с заданного начального файла/каталога в порядке глубины (это означает, что он начинается с файла/каталога наибольшей глубины). Следующая программа печатает полные пути к файлам для полного дерева файлов в папке «C:\My Documents»:
импортировать java.io.IOException;
импортировать java.nio.file.Files;
импортировать java.nio.file.Path;
импортировать java.nio.file.Paths;
импортировать java.util.stream.Stream;
класс FilesWalkExample {
public static void main (аргументы String [])
бросает IOException {
// Создаем блок try-catch и
// указать путь к каталогу локальной машины
try (Stream filepath = Files.walk(Paths.get("C:\\My Documents"))) {
// Выводим полный путь к каталогам и файлам
путь к файлу.forEach(System.out::println);
}
// Выбросить, если каталога не существует
поймать (IOException e) {
выбросить новое IOException("Каталог не найден!");
}
}
} Первые несколько строк вывода подтверждают, что обход файла начал наибольшую глубину:
I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\proxy I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\proxy\page1.html I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\proxy\page2.html I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\proxy\page3.html I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\readOnlyPage.html I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\rectangles.html I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\Redirect.aspx I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\Redirect.aspx.cs I:\Мои документы\Angular\my-app\node_modules\selenium-webdriver\lib\test\data\resultPage.html
Мы также можем включить каталоги, удалив условие фильтра Files::isRegularFile.
Заключительные мысли о навигации по каталогам в Java
Java предоставляет несколько способов обхода каталога, в зависимости от используемой версии. Хотя мы рассмотрели основные из них, в Java есть и другие способы навигации по каталогам, особенно с учетом того, что Stream API был представлен в Java 8.
ПОСМОТРЕТЬ: Обзор инструмента автоматизации сборки Maven
Оригинал