У меня есть файл, который создается каждый раз. Имя файла каждый раз меняется и состоит из фиксированного префикса, за которым следует суффикс текущей даты. Мне нужен способ найти имя файла, используя, возможно, регулярное выражение или что-то еще, используя только известный префикс, например:
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
Как видите, он состоит из префикса, даты года, месяца и дня, разделенных _, а затем часов, минут и секунд. Мне нужно что-то добавить, может быть, отдельные шаблоны для двух дат и способ использования регулярных выражений при поиске в данном каталоге.
Кажется связанным: Каталог списка Java 7 nio с подстановочным знаком
Вы можете использовать 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
@Arvind Kumar Avinash Спасибо за ответ, он мне очень помог. Могу ли я отправить динамический префикс, чтобы сделать его универсальным? Как переменную отправить в метод accept через абстрактный класс? Тот же вопрос для формата даты (если иногда это месяц до года или наоборот)
@elads11 - Добро пожаловать. Вы можете создать функцию, как показано здесь, а затем FileFilter todaysFilesFilter = new FileFilter() { @Override public boolean accept(File file) { return isAcceptable(file.getName()); } };
. Желаем вам успеха!
Вы можете использовать File.listFiles(FileFilter) для поиска файлов в каталоге, имена которых соответствуют определенным критериям.