Часто нам нужно пройти и найти все файлы с определенным шаблоном имени, чтобы выполнить некоторые операции с этими файлами, например, удалить эти файлы. Чаще всего это требуется, когда мы хотим удалить все файлы .log или .tmp с сервера после определенного времени использования приложения(если такое требование существует).
В Java мы можем использовать класс FilenameFilter. Он проверяет, следует ли включать указанный файл в список файлов. Чтобы использовать FilenameFilter, переопределите метод accept(dir, name), содержащий логику для проверки того, следует ли включать файл в отфильтрованный список.
1. Фильтр имен файлов Java
Начиная с Java 8, FileNameFilter является функциональным интерфейсом. Классы, реализующие этот интерфейс, используются для фильтрации имен файлов. Он имеет единственный метод accept(), который принимает два параметра:
- dir: каталог, в котором был найден файл
- имя: имя файла
Данный класс LogFilterFilter можно использовать для фильтрации всех файлов журнала из списка файлов.
открытый класс LogFilterFilter реализует FilenameFilter{@Переопределитьpublic boolean accept(File dir, String fileName){return fileName.endsWith(".log");}}
2. Как использовать FilenameFilter
Лучший способ использования FileNameFilter — передать его одному из следующих методов в классе java.io.File, где File представляет расположение каталога:
- String[] list(filter) : возвращает массив строк, содержащих имена файлов и каталогов в целевом каталоге.
- File[] listFiles(filter) : возвращает массив файлов и каталогов в целевом каталоге.
3. Примеры фильтра имени файла
Давайте рассмотрим несколько примеров, чтобы понять, как можно использовать класс FilenameFilter.
Пример 1: Программа Java для использования FilenameFilter для поиска всех файлов журналов
В этом примере мы будем использовать экземпляр FilenameFilter для перечисления всех файлов «.log» в папке «c:/temp». Мы также удалим все эти файлы журналов.
String targetDirectory = "c:\\temp";File dir = new File(targetDirectory);//Find out all log filesString[] logFiles = dir.list(new LogFilterFilter());//If no log file found; no need to go furtherif(logFiles.length == 0)return;//This code will delete all log files one by onefor(String fileName : logFiles){String logFile = new StringBuffer(targetDirectory).append(File.separator).append(fileName).toString();Files.delete(Paths.get(logFile));System.out.println("Log file : " + logFile + " is deleted");}
Пример 2: Создание FilenameFilter с использованием лямбда-выражения
Поскольку FileNameFilter — это функциональный интерфейс, мы можем сократить его и создать с помощью лямбда-выражения.
FilenameFilter logFileFilter =(d, s) -> {return s.toLowerCase().endsWith(".log");};String[] logFiles = dir.list(logFileFilter);
Пример 3: Создание FilenameFilter, содержащего регулярные выражения
Эта программа Java фильтрует все файлы на основе имен файлов, соответствующих регулярному выражению. Например, мы хотим перечислить все файлы, которые не содержат цифр в своих именах.
FilenameFilter filter =(d, s) -> {return s.matches("[a-zA-z]+\\.[a-z]+");};String[] filteredFiles = dir.list(filter);
4. Заключение
В этом уроке по Java мы научились использовать FilenameFilter для обхода каталога и поиска всех файлов с именами, соответствующими указанному шаблону.