Навигация по каталогам в 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 (Streamfilepath = 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
Оригинал