基于java中的文件名模式获取最新文件
文件名模式为YYYYMDD或YYYYMMDD,如下所示 在目录中具有以下模式的文件列表。 必须根据java中的文件名读取最新文件。 如何做到这一点基于java中的文件名模式获取最新文件,java,Java,文件名模式为YYYYMDD或YYYYMMDD,如下所示 在目录中具有以下模式的文件列表。 必须根据java中的文件名读取最新文件。 如何做到这一点 xxx_2016103 .... xxx_20161104 创建一个小类FileDateWrapper包含字符串文件名;日期时间日期 收集列表中的所有文件名(暂时保留日期为空) 使用一些日期/时间API,如或java.time(Java8+)创建两种日期格式(如您所述) 浏览列表,去除字符(.split()),然后尝试在两种格式上解析结果字符串(例
xxx_2016103
....
xxx_20161104
FileDateWrapper
包含字符串文件名;日期时间日期代码>
列表中的所有文件名(暂时保留日期为空)
java.time
(Java8+)创建两种日期格式(如您所述)
字符(.split()
),然后尝试在两种格式上解析结果字符串(例如,使用。将成功解析的日期存储在文件日期包装器的字段中
Comparator
或Comparable
并对FileDateWrapper
(或Collections.max
)列表进行排序最好的解决方案是获取日期,将其映射到文件,并让对象实现以便对其进行排序这一事实为您完成这项工作
Map<Date,File> filedatemap = new TreeMap<Date,File>();
for(File f : inputdir.listFiles()) { //Assumption: inputdir is a File object pointing to the target directory.
String filename = f.getName();
DateFormat df = new SimpleDateFormat("YYYYMMdd");
Date filedate = df.parse(filename, new ParsePosition(filename.getLastIndexOf('_'));
filedatemap.put(filedate,f);
}
File latestfile = filedatemap.lastEntry().getValue(); //Last entry because natural order of Date is chronological.
//Go do things with that file
Map filedatemap=newtreemap();
对于(文件f:inputdir.listFiles()){//假设:inputdir是指向目标目录的文件对象。
字符串文件名=f.getName();
DateFormat df=新的SimpleDataFormat(“YYYYMMdd”);
datefiledate=df.parse(文件名,新的ParsePosition(文件名.getLastIndexOf(“”));
filedatemap.put(filedate,f);
}
File latestfile=filedatemap.lastEntry().getValue();//最后一项,因为日期的自然顺序是按时间顺序的。
//去处理那个文件
为了获得最佳效果,请牢记Zront的评论,并将您的个位数月/日填入0,以便SimpleDataFormat能够正确解析。如果列表中有您的文件名,您可以创建一个自定义比较器,根据文件名中的日期对列表进行排序
public class FilenamesWithDateSuffixComparator implements Comparator<String> {
private static final int ONE_DIGIT_MONTH_FORMAT = "yyyyMdd".length();
@Override
public int compare(String o1, String o2) {
String date1 = o1.substring(o1.lastIndexOf("_") + 1);
String date2 = o2.substring(o2.lastIndexOf("_") + 1);
// If the dates only have one digit for the month, insert a zero.
if (date1.length() == ONE_DIGIT_MONTH_FORMAT) {
date1 = date1.substring(0, 4) + "0" + date1.substring(5);
}
if (date2.length() == ONE_DIGIT_MONTH_FORMAT) {
date2 = date2.substring(0, 4) + "0" + date2.substring(5);
}
return date1.compareTo(date2);
}
}
或者使用Java 8中的list short方法:
fileNamesList.sort(new FilenamesWithDateSuffixComparator());
例如,您应该在日期中使用占位符零,这将把
xxx\u 2016103
更改为xxx\u 20160103
。我将创建一个普通映射(Hashmap)然后根据for循环后的结果创建一个树映射,因为在树映射中添加条目比在hashmap中慢。回答得好。仅供参考,麻烦的Date
&SimpleDateFormat
类现在已经过时,被java.time类取代。请改用LocalDate
。
fileNamesList.sort(new FilenamesWithDateSuffixComparator());