Java FilenameFilter для поиска файлов, соответствующих шаблону

Часто нам нужно пройти и найти все файлы с определенным шаблоном имени, чтобы выполнить некоторые операции с этими файлами, например, удалить эти файлы. Чаще всего это требуется, когда мы хотим удалить все файлы .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 для обхода каталога и поиска всех файлов с именами, соответствующими указанному шаблону.

Исходный код на Github

Прокрутить вверх