Как получить список всех файлов в директории и ее поддиректориях java

Обновлено: 01.07.2024

Класс File пакета java.io используется для управления информацией о файлах и каталогах. На уровне операционной системы файлы и каталоги имеют существенные отличия, но в Java они описываются одним классом File. Каталог в Java трактуется как обычный файл, но с дополнительным свойством — списком имен файлов, который можно просмотреть с помощью метода list.

В зависимости от назначения объект File - файл или каталог, можно использовать один из конструкторов для создания объекта:

Примеры создания объектов File

Свойства и методы класса File

Для определения стандартных свойств файла в классе File имеются различные методы. Однако класс File несимметричен, т.е. методы определения свойств объекта существуют, но соответствующие функции для изменения этих свойств отсутствуют.

ФункцииОписание
String getName() Наименование файла или каталога.
String getParent() Наименование родительского каталога.
long length() Функция определения размера файла в байтах.
String getAbsolutePath() Функция определения абсолютного пути файла или каталога.
boolean delete() Удаления файла или каталога.
boolean exists() Проверка существования файла или каталога.
boolean isDirectory() Проверка, является ли данный объект каталогом.
boolean isFile() Проверка, является ли данный объект файлом.
long lastModified() Функция определения даты последней модификации файла.
boolean canRead() Проверка, можно ли читать данные из файла.
boolean canWrite() Проверка, можно ли записывать данные в файл.
boolean isHidden() Проверка, являются ли каталог или файл скрытыми.
String[] list() Чтение массива наименований файлов и подкаталогов.
File[] listFiles() Чтение массива файлов и подкаталогов.
boolean mkdir() Создание нового каталога.
boolean renameTo(File dest)Переименовывание файла или каталога.

В следующем примере открываем файл "d:/test/MyFile.txt" (Windows) и извлекаем его характеристики:

В консоли будет отпечатана следующая информация:

Интерфейс FileFilter

Класс File включает метод, позволяющий прочитать список только определенных файлов.

В отличие от одноименного метода, но без параметра, данный метод отбирает только те файлы каталога, которые удовлетворяют определенному условию. Параметр filter предназначен для задания этого условия. При этом тип параметра FileFilter — это не класс, а интерфейс, который имеет всего один метод, возвращающий true, если файл удовлетворяет определенным условиям, и false в противном случае.

Метод listFiles будет вызывать метод accept для каждого файла в каталоге, и те, для которых accept вернет true, будут включены в результирующий список. Остальные будут проигнорированы.

Для использования FileFilter необходимо создать объект и определить в нем соответствующий метод accept.

Пример использования фильтра FileFilter

Чтение содержимого файла FileInputStream

Для чтения содержимого файла можно использовать класс FileInputStream, который является наследником класса InputStream и реализует все его методы. Конструктор класса FileInputStream :

Если файл не может быть открыт то генерируется исключение FileNotFoundException.

Пример считывания данных из файла и вывод содержимого в консоль:

Данные файла можно считать в массив байтов :

Класс FileInputStream предназначен прежде всего для работы с двоичными файлами. Его можно использовать для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы.

Пример использования FileInputStream для чтения файла свойств в кодировке UTF-8:

Файл свойств "data.properties" в кодировке UTF-8:

Запись в файл FileOutputStream

Класс FileOutputStream, является производным от класса OutputStream, поэтому наследует всю его функциональность.

Пример записи строки в файл:

Для создания объекта FileOutputStream используется конструктор, принимающий в качестве параметра путь к файлу для записи. Для записи строки ее сначала переводим в массив байт и с помощью метода write строка записывается в файл. Необязательно записывать весь массив байтов. Используя перегрузку метода write(), можно записать и одиночный байт:

Пример перезаписи содержимого из одного файла в другой:

Класс FileOutputStream предназначен прежде всего для записи двоичных файлов. Его можно использовать для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы.

Чтобы работать с файлами, есть шикарный утилитный класс — java.nio.file.Files . У него есть методы просто на все случаи жизни. Все методы этого класса статические и работают с объектами типа Path. Методов очень много, поэтому мы рассмотрим только основные:

Метод Описание
Создает новый файл с путем path
Создает новую директорию
Создает несколько директорий
Создает временный файл
Создает временную директорию
Удаляет файл или директорию, если она пуста
Копирует файл
Перемещает файл
Проверяет, что путь — это директория, а не файл
Проверяет, что путь — это файл, а не директория
Проверяет, что объект по заданному пути существует
Возвращает размер файла
Возвращает все содержимое файла в виде массива байт
Возвращает все содержимое файла в виде строки
Возвращает все содержимое файла в виде списка строк
Записывает в файл массив байт
Записывает в файл строку
Возвращает коллекцию файлов (и поддиректорий) из заданной директории

2. Создание файлов и директорий

Файлы и директории создавать очень просто. Убедимся на примерах:

Код Примечание
Создает файл
Создает директорию
Создает директорию и все нужные поддиректории, если их не существует.

3. Копирование, перемещение и удаление

Копировать, перемещать и удалять файлы так же легко. На директории это тоже распространяется, но они должны быть пустые.

Код Примечание
Копирует файл
Перемещает и переименовывает файл
Удаляет файл

4. Проверка типа файла и факта существования

Когда у вас есть какой-то путь, полученный извне, вы бы хотели знать, это файл или директория. Ну и вообще: существует такой файл/директория или нет?

Для этого тоже есть специальные методы. Так же можно легко узнать длину файла:

Код Примечание

5. Работа с содержимым файла

И наконец, есть целая серия методов, которые позволяют легко прочитать или записать содержимое файла. Пример:

Многие приложения каким-то образом обрабатывают файлы, и манипулирование файлами является одним из основных знаний на любом языке программирования.

Чтобы манипулировать файлами, нам нужно знать, где они находятся. Наличие обзора файлов в каталоге имеет первостепенное значение, если мы хотим этого добиться, особенно если мы можем выполнять операции с ними с помощью итерации. В Java есть несколько способов сделать это, которые мы покажем в этой статье.

Для простоты все примеры будут написаны для следующего дерева файлов:

Файл.список()

Самым простым методом для перечисления имен файлов и папок в заданном каталоге без обхода подкаталогов является вспомогательный метод .list () , который возвращает массив String s.

Мы делаем это с помощью метода .list() в экземпляре Файла :

Используя простой цикл для каждого , мы перебираем массив и выводим Строку s.

При использовании этого подхода все элементы в каталоге Кодирование музыки не отображаются, и недостатком этого подхода является то, что мы действительно ничего не можем сделать с самими файлами. Мы только узнаем их имена. Это полезно, когда мы просто хотим взглянуть на файлы по номиналу.

Фильтр имен файлов

Запуск этого фрагмента кода приведет к:

Файл.listFiles()

Подобно предыдущему методу, этот метод можно использовать для возврата имен файлов и каталогов, но на этот раз мы получаем их в виде массива объектов File , что дает нам возможность напрямую манипулировать ими:

Теперь давайте углубимся в файловую систему, используя рекурсию и еще несколько методов для использования с Файлом объектом:

Файлы.прогулка()

В Java 8 и более поздних версиях мы можем использовать файл java.nio.Файлы класс для заполнения потока и использования его для просмотра файлов и каталогов и в то же время рекурсивного обхода всех подкаталогов.

Обратите внимание, что в этом примере мы будем использовать лямбда-выражения:

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Здесь мы заполнили Поток , используя метод .walk () , передав аргумент Пути|/. Класс Пути состоит из статических методов , которые возвращают Путь на основе строкового URI - и, используя Путь , мы можем легко найти файл.

Путь , Пути , Файлы и многие другие классы принадлежат пакету java.nio , который был представлен в Java 7 как более современный способ представления файлов неблокирующим способом.

Затем с помощью Collections Framework создается список.

Запуск этого фрагмента кода приведет к:

Вывод

Обработка файлов каким-либо образом является основной задачей для большинства языков программирования, и это включает в себя возможность перечислять и находить файлы в файловой системе. Чтобы манипулировать файлами, нам нужно знать, где они находятся. Наличие обзора файлов в каталоге имеет первостепенное значение, если мы хотим этого добиться, особенно если мы можем выполнять операции с ними с помощью итерации.

В этой статье мы показали несколько различных способов в Java перечисления файлов в файловой системе, используя как линейный, так и рекурсивный подходы.

В примере используется try-with-resources, рекомендованный в руководстве API. Он гарантирует, что в любом случае поток будет закрыт.

getName() даст только имя файла в его каталоге, который может быть подкаталогом оригинала. Если вы планируете использовать эту информацию для поиска файлов, вы можете найти путь, заданный getPath() более полезным. Могу ли я использовать этот метод, чтобы найти все файлы определенного типа, например pdf или html, по всей моей системе? Меня беспокоит эффективность, достаточно ли это быстро для систем с тысячами файлов или есть лучшая альтернатива? @codeln Начиная с Java 8, производительность очень приемлема, вы не заметите ничего запоздалого. Это быстро, эффективно и достаточно для чтения, чтобы сделать вашу работу. Просто чтобы указать, что это только инициализировано один раз. Прекрасная рекурсия. Это как предзаказ путешествовать. Ницца. Этот ответ и все остальные, использующие функции Java 8, пренебрегают закрытием потока. Смотрите мой отдельный ответ для примера правильного способа использования Files.walk. Давайте не будем забывать об импорте здесь для тех, кто получает NoClassDefFoundError для объекта File. импорт java.io.File; Я думаю, что это будет печатать имена каталогов, а не имена файлов

В Java 8 вы можете сделать это

который будет печатать все файлы в папке, исключая все каталоги. Если вам нужен список, выполните следующие действия:

Если вы хотите вернуть List<File> вместо List<Path> , просто нарисуйте его:

Вам также необходимо закрыть поток! В противном случае вы можете запустить исключение, сообщив вам, что слишком много файлов открыты. Подробнее читайте здесь.

Получение ошибки с .map (Path :: toFile) Также .forEach (путь -> System.out.println (path.toString ()); должен быть .forEach (путь -> System.out.println (path.toString ( ))); Спасибо за исправление. Какая у вас ошибка? Я выполняю точный код в моем проекте и не получаю ошибку. Там написано: «Недопустимая ссылка на метод, не удается найти символ» У меня была та же проблема, но автоматический импорт импортировал что-то другое, а не java.nio.file.Path. и применить фильтр имен файлов (например, по расширению, используя String.endsWith ()) после этого тоже очень легко, спасибо! Похоже, ваш компилятор Java установлен на 1.7. Увеличьте его до 1.8 и / или установите новую версию вашей IDE. @JulianLiebl как мы пропускаем скрытые файлы? filter(Files::isHidden) не работает. Ошибка говорит: «Необработанное исключение типа IOException», но метод уже выбрасывает IOException. @NadjibMami Пожалуйста, посмотрите здесь: razem.io/blog/posts/year2015/0819_try_catch_lambda Был составлен, чтобы ответить в комментарии. Так что я написал быстрый пост в блоге. @JulianLiebl Вот это круто. Спасибо за ваши усилия, это действительно помогает! Вы можете написать forEach как .forEach(System.out::println) . Также .collect(Collectors.toList()) не нужен в вашем первом примере. @YingYang Я обновил ответ, чтобы решить ваши проблемы. Если кто-то все еще ищет тему «Попробуй поймать лямбду», URL моего блога был изменен -> razem.io/blog/y2015/0819_try_catch_lambda.html Как закрыть поток, если ваш код подобен второму примеру кода: List <File> filesInFolder = Files.walk (Paths.get ("/ path / to / folder")) .filter (Files :: isRegularFile) .map (Path :: toFile) .collect (Collectors.toList ()); <Код>

Все ответы на эту тему, которые используют новые функции Java 8, пренебрегают закрытием потока. Пример в принятом ответе должен быть:

Из javadoc метода Files.walk :

Возвращенный поток инкапсулирует один или несколько DirectoryStreams. Если требуется своевременная утилизация ресурсов файловой системы, конструкция try-with-resources должна использоваться для обеспечения того, чтобы метод закрытия потока вызывается после завершения операций потока.

Вы никогда не должны повторяться с потоком. Вы берете ссылку на поток, используете его и через него прочь. Я имею в виду, что правильно использовать это следующим образом: Files.walk (Paths.get ("/ home / you / Desktop")). Filter (Files :: isRegularFile) .forEach (filePath -> . ) Это решение для Android для чтения всех файлов и папок с SDCard или внутренней памяти. Согласен, просто опубликовать блок кода не получится. По крайней мере, добавьте несколько комментариев в код .

Вы также можете создать фильтр, который затем может быть передан методу newDirectoryStream выше

Я смущен примером создания фильтра. Что такое newDirectoryStream.Filter <Path>. Можете ли вы показать, как это заявлено?

Просто пройдите через все файлы, используя Files.walkFileTree (Java 7)

Обратите внимание, что этот код будет генерировать исключение (и не сообщать о каких-либо дополнительных файлах), если для какого-либо файла или каталога атрибуты файла не могут быть прочитаны, например, из-за разрешений. Легко воспроизводить на `C:`.

Если вы хотите больше параметров, вы можете использовать эту функцию, которая предназначена для заполнения массива файлов, находящихся в папке. Возможны следующие варианты: рекурсивность и шаблон для соответствия.

Пока я согласен с Rich, Orian и остальные для использования:

по какой-то причине все примеры здесь используют абсолютный путь (т.е. от корня или, скажем, буквы диска (C: \) для окон..)

Я хотел бы добавить, что возможно использовать относительный путь. Итак, если вы pwd (текущий каталог/папка) - папка1, и вы хотите проанализировать папку folder1/subfolder, вы просто пишете (в коде выше, а не):

Простой пример, который работает с Java 1.7 для рекурсивного отображения файлов в каталогах, указанных в командной строке:

Я думаю, что это хороший способ прочитать все файлы в папке и подпапках

Вот безопасное решение, хотя и не столь элегантное, как Java 8 Files.walk(..) :

Возможно, вы захотите добавить объяснение того, чего вы пытаетесь достичь, вместо того, чтобы показывать только код. Кроме того, myarray=new File[10]; не требуется, так как будет перезаписано следующей строкой!

Одно замечание по получению всех файлов в каталоге.
Метод Files.walk(path) будет возвращать все файлы путем Files.walk(path) файлового дерева с корнем в данном запущенном файле.

Например, существует следующее дерево файлов:

Дает следующий результат:

Чтобы получить все файлы только в текущем каталоге, используйте java.nio.file.Files.list(Path) :

Имея baseDir, перечисляет все файлы и каталоги под ним, написанные итеративно.

Вы можете поместить путь к аргументу и создать список со всеми файловыми путями и не поместить его в список вручную. Затем используйте цикл for и считыватель. Пример для файлов txt:

Это будет нормально работать:

Это будет чтение заданных файлов расширения файлов в указанном пути (также выглядит вспомогательные папки)

Извините, если это нубский вопрос, но что я должен передать как files container ?

Теперь, чтобы получить файлы из определенной папки, скажем, у вас есть папка с именем "res" в папке ресурсов, просто замените:

Просто для того, чтобы расширить принятый ответ, я сохраняю имена файлов в ArrayList (вместо того, чтобы просто отбрасывать их на System.out.println). Я создал вспомогательный класс "MyFileUtils", чтобы он мог быть импортирован другими проектами:

Я добавил полный путь к имени файла. Вы бы использовали его следующим образом:

ArrayList передается по "value", но значение используется для указания на тот же объект ArrayList, который живет в JVM Heap. Таким образом, каждый вызов рекурсии добавляет имена файлов в один и тот же ArrayList (мы НЕ создаем новый ArrayList для каждого рекурсивного вызова).


Следуйте за нами на нашей фан-странице, чтобы получать уведомления каждый раз, когда появляются новые статьи. Facebook

1- Обзор

На самом деле, вы часто работаете с файлами и папками в системе, операции здесь включают добавление, удаление, переименование. Java дает вам два класса, чтобы сделать это:

Java.io.File класс представляет файл (file) или папку (directory) системы, он введен в Java, из версии 1.0

Версия 7.0, Java дополняет java.nio.file.Files класс, что позволяет легко манипулировать файлами и папками, все методы этого класса являются статическими и естественными (static and nature)

В этой статье я только говорю об использовании класса java.io.File, вы можете посмотреть больше про java.nio.file.Files по ссылке:

2- java.io.File

Java.io.File класс представляет файл или папку в системе, которая представляет путь (pathname). В следующем примере создается объект File представляющий путь в Windows, или Unix:

java.io.File может представлять собой путь (pathname), где этот путь может на самом деле не существовать в системе. Если существовует, то может быть в виде папки (directory) или файла (file).

Следующий простой пример создает объект File, который представляет собой путь, и проверяет его существование, записывает основную информацию, если путь на самом деле существует:




3- Создать каталог

Класс File содержит два метода для создания:

Метод Описание
public boolean mkdir() Создает папку данную путем. Заметьте, что папка создается только при существовании родительской папки.
public boolean mkdirs() Создает папку данную путем, включая родительскую папку если она не существует.


4- File Filter

Java.io.File класс предлагает несколько способов, чтобы получить список подфайлов и подкаталогов в каталоге. И использует FileFilter для фильтрации файлов

Возвращает массив объектов File, который представляет корневой каталог. В операционной системе Windows это диски (C:, D :, ..) в Unix это /

Возвращает массив объектов File, файлы и подпапки из текущей папки, и соотствествующий фильтру FilenameFilter на параметр.

Возвращает массив объектов File, файлы и подпапки из текущей папки, и соответствует с фильтром FilenameFilter на параметр


В следующем примере составляется список всех файлов и подпапок в непосредственной папке:


Простой пример ниже использует FileFilter, чтобы отфильтровать файлы в папке и имеющие расширенную часть"txt":

Читайте также: