如何查找并获取带可变日期后缀的完整文件名
解决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
相关产品推荐
相关产品推荐

