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

标签 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 ?

最佳答案

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

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

关于java - 如何使用 FileNameFilter 列出目录中的最新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21236105/

相关文章:

java - 用于内存中文件传输的 OutputStream 和 InputStream 的实现者

java - 将 JButton 文本绑定(bind)到属性

java - NoSuchMethodFound 异常

Python 在一次 write() 后关闭文件

WINDOWS 上的 MySQL LOAD DATA LOCAL INFILE 不工作

java - 下载程序后无法通过进程运行程序(Java)

java - 如何使用 javax.xml.xpath 对 XML 文件运行 XQuery?

java - 推送器错误 : Couldn't get auth info from your webapp : 500 (Focus at 500 error)

python - 格式化要写入的文件

java - 如果服务器响应超时,使用具有 UNC 路径的 Java File.delete() 会得到什么