2016-08-24 56 views
-4

我有一个文件夹中的多个文件的命名约定如何从基于日期在java中

Name_MoreName_DDMMYYYY_SomeNumber_HHMMSS.txt 

我怎样才能得到它具有最早的日期和时间的文件(即最老的DDMMYYYY该文件夹中的文件和HHMMSS)。

对于下面的例子:

Name_MoreName_22012012_SomeNumber_072334.txt 
Name_MoreName_22012012_SomeNumber_072134.txt 
Name_MoreName_24012012_SomeNumber_072339.txt 
Name_MoreName_22012012_SomeNumber_072135.txt 

...最早的文件将是

Name_MoreName_22012012_SomeNumber_072134.txt 
+0

获取文件名,对它们进行排序并根据排序挑选顶部/底部 – Sanjeev

+0

我想获取文件夹中最后添加的文件以及我的文件名if-logFile_2016_Jun_02_115011 .... –

+0

我编辑了我的答案来协助文件名称模式的更改。随时upvote,如果它可以帮助你。 – Jason

回答

0

首先,阅读文件的名称为List<String>

然后使用该理解的文件名格式的比较列表进行排序:

public class FileNameComparator implements Comparator<String> { 

    private static Pattern pattern = Pattern.compile("^.*?_([0-9]{2})([0-9]{2})([0-9]{4})_.*?_([0-9]{2})([0-9]{2})([0-9]{2})\\.txt$"); 
    private static int[] groupOrder = new int[]{3, 2, 1, 4, 5, 6}; 

    @Override 
    public int compare(String filename1, String filename2) { 
     Matcher matcher1 = pattern.matcher(filename1); 
     Matcher matcher2 = pattern.matcher(filename2); 

     return compareMatchers(matcher1, matcher2); 
    } 

    private int compareMatchers(Matcher matcher1, Matcher matcher2) { 
     if (matcher1.matches()) { 
      if (matcher2.matches()) { 

       // for each group in the correct order (year, month, date, hour, minute, second) 
       for (int group : groupOrder) { 
        int result = compareValues(matcher1.group(group), matcher2.group(group)); 
        if (result != 0) { 
         return result; 
        } 
       } 

       return 0; 

      } else { 
       // filename 2 is incorrect pattern 
       return -1; 
      } 
     } else { 
      // filename 1 is incorrect pattern 
      return 1; 
     } 
    } 

    private int compareValues(String value1, String value2) { 
     return new Integer(value1).compareTo(new Integer(value2)); 
    } 
} 

排序:

List<String> filenames = ...; /* populate the list of filenames */ 
Collections.sort(filenames, new FileNameComparator()); 

为了获得最古老,占据第一位。为了获得最年轻的,拿走最后一个。

编辑:如果你更新后的文件名模式是:

if-logFile_2016_Jun_02_115011.txt 

...那么正则表达式和代码将需要改变,以能够提取的参数和执行正确的比较。正则表达式是:

^.*?_([0-9]{4})_(.{3})_([0-9]{2})_([0-9]{2})([0-9]{2})([0-9]{2})\\.txt$ 

...你会处理他们为了(1,2,3,4,5,6),当你处理小组第二,你需要在一个月名比较订购。

+0

修改为覆盖文件名模式的更改。 – Jason

+0

好的...谢谢你jason –

+0

文件f1 =新文件(下载文件夹)+ System.getProperty(“file.separator”)+ nsFile.getName()); f1.delete();请告诉我什么是错的是 –