基于java中的文件名模式获取最新文件

基于java中的文件名模式获取最新文件,java,Java,文件名模式为YYYYMDD或YYYYMMDD,如下所示 在目录中具有以下模式的文件列表。 必须根据java中的文件名读取最新文件。 如何做到这一点 xxx_2016103 .... xxx_20161104 创建一个小类FileDateWrapper包含字符串文件名;日期时间日期 收集列表中的所有文件名(暂时保留日期为空) 使用一些日期/时间API,如或java.time(Java8+)创建两种日期格式(如您所述) 浏览列表,去除字符(.split()),然后尝试在两种格式上解析结果字符串(例

文件名模式为YYYYMDD或YYYYMMDD,如下所示

在目录中具有以下模式的文件列表。 必须根据java中的文件名读取最新文件。 如何做到这一点

xxx_2016103
....
xxx_20161104
  • 创建一个小类
    FileDateWrapper
    包含
    字符串文件名;日期时间日期
  • 收集
    列表中的所有文件名(暂时保留日期为空)
  • 使用一些日期/时间API,如或
    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());