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

Java 如何使用FileNameFilter列出目录中的最新文件,java,file-io,java-io,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

我有一个包含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?

我不太明白您想要做什么,但是
DirectoryStream
可以用于检索目录中的特定文件。您可以使用获取
DirectoryStream
,也可以选择传入一个glob或一个过滤器来选择您需要/不需要的内容

引用以下文件:

一种接口,由决定目录是否存在的对象实现 应接受或筛选条目。一个过滤器作为 Files.newDirectoryStream(路径,DirectoryStream.Filter)的参数 方法打开目录以迭代 目录


总而言之,编写一个自定义过滤器,实现
DirectoryStream.filter
接口,并将搜索条件逻辑放入
accept()
我不确定它是否是您需要的,但我认为您可以从文件名中检索数据和时间,将其解析为最新时间并获得最大的,因此它将是最新版本,对吗?

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

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]);
    }
File f=新文件(“C:\\”)//当前目录
ArrayList序列=新的ArrayList();
顺序。添加(“塔塔”);
顺序。添加(“TOTO”);
FilenameFilter筛选器=新建FilenameFilter(){
公共布尔接受(文件目录,字符串名称){
String lowercaseName=name.toLowerCase();
if(小写名称.endsWith(“.xml”))
返回true;
其他的
返回false;
}
};
字符串[]totoFiles=f.list(过滤器);
sort(totoFiles,Collections.reverseOrder());
for(字符串类型:序列){
int i=0;
对于(;i
阅读上的教程。文件的时间戳是否与名称相同?是的,这正是我需要的,但我正在寻找一种简单的方法this@Remy这正是我要说的。你需要一些自己的过滤机制。看到我的答案了吗谢谢,我要一个look@Remy如果你能发布你的搜索条件,那就太好了!这是我想做的一件事,但“TOTO”和“TATA”都是例子。我知道TATA和TOTO都是例子,但无法使用FileNameFilter通过快捷方式完成,因为每种文件都需要一个文件。或者,您可以将所有文件添加到一个数组中,在对数组进行排序后循环遍历该数组,并在每次获得不同类型的文件时进行打印。我希望你能理解。正如我在之前的评论中提到的,我已经添加了第二种方法,这种方法更容易扩展到包括其他要过滤的字符序列。看起来就像我刚才做的那样。谢谢!!