Сегодня любая операционная система имеет встроенные средства для поиска файлов. Во многих случаях что-то подобное хотелось бы использовать в своих программах. В этой статье я покажу, как создать небольшой Java класс, который можно будет использовать в любой программе для поиска файлов. Создание класса для поиска файлов Сегодня любая операционная система имеет встроенные средства для поиска файлов. Во многих случаях что-то подобное хотелось бы использовать в своих программах. В этой статье я покажу, как создать небольшой Java класс, который можно будет использовать в любой программе для поиска файлов. В первую очередь, давайте определимся, что именно должен делать наш класс. Для большинства случаев, я думаю, будет достаточно таких возможностей:
- поиск заданных файлов и папок в начальной папке и всех её вложенных папках; общая статистика поиска (количество найденных файлов и папок, общий размер файлов); использование регулярных выражений в качестве шаблонов для имен найденных файлов и папок (выборочный поиск); поиск отдельно файлов, и отдельно папок.
Теперь посмотрим, какие стандартные библиотеки из JDK (java development kit) нам понадобятся. В состав пакета java. io входит класс File, предназначенный для работы с файлами и папками. Он имеет методы для определения содержимого папки. Так что, нам остаётся добавить просмотр вложенных папок и поддержку регулярных выражений. Несколько слов о том, что такое регулярные выражения. Это текстовые строки, составленные по определённым правилам, которые можно использовать в качестве шаблонов. Библиотека Java содержит пакет java. util. regex, предназначенный для работы с регулярными выражениями. Подробнее почитать о правилах составления и возможностях регулярных выражений можно в статье: Анализ данных с помощью регулярных выражений или быстрый способ проверки введённых данных. Таким образом, наш класс, назовём его FileFinder, должен иметь такой набор методов. Для поиска файлов и папок: public List findAll(String startPath) public List findAll(String startPath, String mask) Для поиска только файлов: public List findFiles(String startPath) public List findFiles(String startPath, String mask) Для поиска только папок: public List findDirectories(String startPath) public List findDirectories(String startPath, String mask) Каждый найденный объект (файл или папка) включается в список результатов только в том случае, если он соответствует регулярному выражению, заданному в параметре mask. Все методы возвращают результат в виде списка объектов типа File. С помощью методов: public long getDirectorySize() public long getFilesNumber() public long getDirectoriesNumber() определяем количество найденных файлов и папок, и размер файлов. Теперь, рассмотрим самую интересную часть. Поиск файлов. Он выполняется с помощью двух методов. Первый, private List find(String startPath, String mask, int objectType) выполняет начальную подготовку к поиску: сброс счётчиков, проверку допустимости параметров, компиляцию регулярного выражения и т. п.. Второй метод, private void search(File topDirectory, List res, int objectType) вызывается только из метода find(…), он и выполняет поиск. В качестве параметров, методу search(…) передаются: имя папки, указатель на список для хранения найденных объектов, и тип нужного объекта (файлы, папки, всё подряд). С помощью метода listFiles() класса File определяем список файлов и папок в текущей папке (параметр topDirectory), а затем, для каждой найденной папки снова вызываем метод search(…), но в параметре topDirectory передаём найденную папку. Такой способ вызова методов называется рекурсией. Т. е. метод search(…) будет вызывать сам себя до тех пор, пока не пройдёт все вложенные папки. Каждый найденный объект (папка или файл) проверяется на соответствие регулярному выражению (если оно задано) с помощью метода accept(), и, если проверка прошла успешно, добавляется в список результатов. Теперь посмотрим на весь класс целиком.