如何使用FileNameFilter列出目录中的最新文件

雷米

我有一个包含xml Files的目录:

 20140110-093721565_TOTO.xml
 20140110-093821565_TATA.xml
 20140110-094021565_TOTO.xml
 20140110-091021565_TOTO.xml
 20140110-093921565_TATA.xml
 ....
 20140110-091021565_TETE.xml

文件名的第一部分表示生成文件的时间:20140110-09102156

 20140110 = Date
 09102156 = Hour

最后一部分用于标识文件:TOTO

我想要列出的是每个文件的最新版本,例如:

20140110-091021565_TOTO.xml
20140110-093821565_TATA.xml

如何定义FileNameFilter?

我不确定是否有一种方法可以提供过滤器来将结果限制为一个,因为文件名是不断变化的。这是一种实现您想要的东西的方法。

File f = new File("C:\\");  // what ever directory you want. 

FilenameFilter totoFilter = new FilenameFilter()
{
    public boolean accept(File dir, String name) 
    {
        String lowercaseName = name.toLowerCase();
        if (lowercaseName.endsWith("TOTO.xml")) return true;
        else                                    return false;

    }
};

FilenameFilter tataFilter = new FilenameFilter() {
    public boolean accept(File dir, String name) {
        String lowercaseName = name.toLowerCase();
        if (lowercaseName.endsWith("TOTO.xml")) return true;
        else                                    return false;
    };

    String[] tataFiles = f.list(tataFilter);
    Arrays.sort(tataFiles, Collections.reverseOrder());

    String[] totoFiles = f.list(totoFilter);
    Arrays.sort(totoFiles, Collections.reverseOrder());

    System.out.println(tataFiles[0]);
    System.out.println(totoFiles[0]);
}

我编写了一种替代逻辑,即使您必须添加类型,它也可以帮助您用更少的新行扩展想要实现的目标。这遵循了我在评论中提到的方法。您所要做的就是向数组列表添加新序列,该序列定义了另一种文件类型。

    File f = new File("C:\\"); // current directory

    ArrayList<String> sequence = new ArrayList<>();
    sequence.add("TATA");
    sequence.add("TOTO");

    FilenameFilter filter = new FilenameFilter() {
        public boolean accept(File dir, String name) {
            String lowercaseName = name.toLowerCase();
            if (lowercaseName.endsWith(".xml"))
                return true;
            else
                return false;
        }
    };

    String[] totoFiles = f.list(filter);
    Arrays.sort(totoFiles, Collections.reverseOrder());
    for (String type : sequence) {
        int i = 0;
        for (; i < totoFiles.length; i++) {
            if (totoFiles[i].contains(type))
                break;
        }
        System.out.println(totoFiles[i]);
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章