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

时间:2014-01-20 14:07:53

标签: java file-io java-io

我有一个包含xml文件的目录:

 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?

3 个答案:

答案 0 :(得分:2)

我不确定是否有办法提供过滤器,将结果限制在您的案例中只有一个,因为文件名一直在变化。这是实现你想要的一种方法。

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]);
    }

答案 1 :(得分:1)

我不太明白你想做什么,但DirectoryStream<Path>可以用来检索目录中的特定文件。您可以使用the static method of nio.file.Files class获取DirectoryStream<>,也可以选择传入glob或过滤器来选择您需要/不需要的内容。

引用 DirectoryStream.Filter的文档:

  

由决定目录的对象实现的接口   应接受或过滤条目。过滤器作为传递   Files.newDirectoryStream的参数(Path,DirectoryStream.Filter)   打开目录以迭代中的条目时的方法   目录。

总结一下,编写一个实现DirectoryStream.Filter界面的自定义过滤器,并将搜索条件逻辑放在accept()

答案 2 :(得分:0)

我不确定这是你需要的,但我认为你可以从文件名中检索数据和时间,将其解析为日期时间并获得最大的一个,所以它将是最后一个版本,对吧?