将文件名模式设为YYYYMDD或YYYYMMDD,如下所示。
在目录中包含具有以下模式的文件列表。 必须根据java中的文件名读取最新文件。 怎么做?
xxx_2016103
....
xxx_20161104
答案 0 :(得分:1)
最佳解决方案是获取日期,将它们映射到文件,并让TreeMap
个对象实现SortedMap
这样的事实,以便他们为您完成工作。
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
为了获得最佳效果,请将Zircon的评论记录为心脏并用0填充您的单个数字Months / Days,以便SimpleDateFormat能够正确解析。
答案 1 :(得分:0)
FileDateWrapper
String filename; DateTime date;
List<FileDateWrapper>
中的所有文件名(暂时保留日期为null)java.time
(Java 8 +)创建两种日期格式(如您所述)_
字符(.split()
),然后尝试解析两种格式的结果字符串(例如,使用parseDateTime(String)。存储日期在FileDateWrapper
Comparator
或Comparable
并对您的FileDateWrapper
(或Collections.max
)答案 2 :(得分:0)
如果列表中有文件名,则可以创建自定义比较器,根据文件名中的日期对列表进行排序。
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);
}
}
然后,您可以使用比较器对列表进行排序:
Collections.sort(fileNamesList, new FilenamesWithDateSuffixComparator());
或者使用Java 8中的list short方法:
fileNamesList.sort(new FilenamesWithDateSuffixComparator());