You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找并获取带可变日期后缀的完整文件名

解决Java中按固定前缀+日期格式查找文件的问题

你原来的代码里用*通配符直接创建File对象是行不通的,Java的File类不支持这种通配符匹配逻辑。要实现按固定前缀+日期格式查找文件,你可以用正则表达式匹配文件名,结合目录遍历完成需求。

步骤1:编写匹配文件名的正则表达式

根据你给出的文件名格式PREFIX_yyyy-mm-dd_hh-mm-ss,对应的正则表达式为:

private static final String FILE_PATTERN = "^PREFIX_\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}$";
  • ^ 和 $:确保匹配完整的文件名,避免部分匹配
  • \\d{4}-\\d{2}-\\d{2}:匹配yyyy-mm-dd格式的日期
  • \\d{2}-\\d{2}-\\d{2}:匹配hh-mm-ss格式的时间

步骤2:遍历目录并匹配文件

下面提供两种实现方式:

方式一:使用传统File API遍历

import java.io.File;
import java.util.regex.Pattern;

public class FileFinder {
    private static final String FILE_PATTERN = "^PREFIX_\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}$";
    private static final Pattern pattern = Pattern.compile(FILE_PATTERN);

    public static File findMatchingFile(String directoryPath) {
        File directory = new File(directoryPath);
        if (!directory.isDirectory()) {
            return null;
        }

        File[] files = directory.listFiles();
        if (files == null) {
            return null;
        }

        // 遍历所有文件,匹配正则
        for (File file : files) {
            if (file.isFile() && pattern.matcher(file.getName()).matches()) {
                // 返回第一个匹配的文件
                return file;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        File result = findMatchingFile("my_path");
        if (result != null) {
            System.out.println("找到文件:" + result.getAbsolutePath());
        } else {
            System.out.println("未找到匹配的文件");
        }
    }
}

方式二:使用NIO Files API(Java 8+)

流式API更简洁,还能方便地获取最新的匹配文件:

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Comparator;
import java.util.Optional;
import java.util.regex.Pattern;

public class NIOFileFinder {
    private static final String FILE_PATTERN = "^PREFIX_\\d{4}-\\d{2}-\\d{2}_\\d{2}-\\d{2}-\\d{2}$";
    private static final Pattern pattern = Pattern.compile(FILE_PATTERN);

    public static Optional<File> findLatestMatchingFile(String directoryPath) {
        try {
            return Files.walk(Paths.get(directoryPath), 1) // 仅遍历当前目录,不递归
                    .filter(Files::isRegularFile)
                    .map(Path::toFile)
                    .filter(file -> pattern.matcher(file.getName()).matches())
                    .max(Comparator.comparingLong(File::lastModified)); // 按修改时间取最新文件
        } catch (Exception e) {
            e.printStackTrace();
            return Optional.empty();
        }
    }

    public static void main(String[] args) {
        findLatestMatchingFile("my_path").ifPresentOrElse(
                file -> System.out.println("找到最新文件:" + file.getAbsolutePath()),
                () -> System.out.println("未找到匹配的文件")
        );
    }
}

补充说明

  • 如果需要同时支持带时间和仅带日期的两种格式,修改正则表达式为^PREFIX_\\d{4}-\\d{2}-\\d{2}(?:_\\d{2}-\\d{2}-\\d{2})?$即可,其中(?:...)是不捕获的可选分组。
  • 若目录下有多个匹配文件,可根据需求选择返回第一个匹配项,或按修改时间/文件名排序后的目标文件。

内容的提问来源于stack exchange,提问作者elads11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:20:28