Как найти и получить полное имя файла с изменяемым суффиксом даты

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

 String localFile = "my_path" + "PREFIX_*";
 File localFile = new File(localFileStr);
 if (localFile.exists()) {
     return localFile;
 }

Пример имени файла:

the prefix: PREFIX_
pattern1: yyyy-mm-dd
pattern2: _hh-mm-ss 
all together: PREFIX_yyyy-mm-dd_hh-mm-ss 
Actual example: PREFIX_2022-11-27_10-45-14

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

Вы можете использовать File.listFiles(FileFilter) для поиска файлов в каталоге, имена которых соответствуют определенным критериям.

Thomas Behr 27.11.2022 11:04

Кажется связанным: Каталог списка Java 7 nio с подстановочным знаком

Ole V.V. 27.11.2022 21:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать java.time API, чтобы преобразовать имя файла в LocalDateTime, а затем сравнить часть даты с сегодняшней датой. Если парсинг не удался или критерий для текущей даты не соблюден, вы можете вернуть false из FileFilter#accept.

Демонстрация парсинга и критерий текущей даты:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("'PREFIX_'uuuu-MM-dd_HH-mm-ss", Locale.ENGLISH);
        String fileName = "PREFIX_2022-11-27_10-45-14";
        LocalDateTime ldt = LocalDateTime.parse(fileName, parser);
        System.out.println(ldt);
        System.out.println(ldt.toLocalDate().equals(LocalDate.now()));
    }
}

Выход:

2022-11-27T10:45:14
true

Теперь давайте создадим FileFilter, используя описанную выше концепцию:

FileFilter todaysFilesFilter = new FileFilter() {
    @Override
    public boolean accept(File file) {
        String fileName = file.getName();
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("'PREFIX_'uuuu-MM-dd_HH-mm-ss", Locale.ENGLISH);
        try {
            if (!LocalDateTime.parse(fileName, parser).toLocalDate().equals(LocalDate.now()))
                return false;
        } catch (DateTimeParseException e) {
            return false;
        }
        return true;
    }
};

Последний шаг — получить список файлов,

File[] files = your-directory.listFiles(todaysFilesFilter);

Learn more about the modern Date-Time API from Trail: Date Time.

очень хорошее использование FileFilter

anubhava 27.11.2022 16:08

@Arvind Kumar Avinash Спасибо за ответ, он мне очень помог. Могу ли я отправить динамический префикс, чтобы сделать его универсальным? Как переменную отправить в метод accept через абстрактный класс? Тот же вопрос для формата даты (если иногда это месяц до года или наоборот)

elads11 06.12.2022 14:07

@elads11 - Добро пожаловать. Вы можете создать функцию, как показано здесь, а затем FileFilter todaysFilesFilter = new FileFilter() { @Override public boolean accept(File file) { return isAcceptable(file.getName()); } };. Желаем вам успеха!

Arvind Kumar Avinash 07.12.2022 18:11

Другие вопросы по теме