如何按字母顺序File.listFiles?

Thu*_*bit 89 java java-io

我有以下代码:

class ListPageXMLFiles implements FileFilter {

        @Override
        public boolean accept(File pathname) {
                DebugLog.i("ListPageXMLFiles", "pathname is " + pathname);

                String regex = ".*page_\\d{2}\\.xml";
                if(pathname.getAbsolutePath().matches(regex)) {
                        return true;
                }
                return false;
        }
}

public void loadPageTrees(String xml_dir_path) {
        ListPageXMLFiles filter_xml_files = new ListPageXMLFiles();
        File XMLDirectory = new File(xml_dir_path);
        for(File _xml_file : XMLDirectory.listFiles(filter_xml_files)) {
                loadPageTree(_xml_file);
        }
}
Run Code Online (Sandbox Code Playgroud)

该FileFilter工作很好,但listFiles()似乎在上市相反的字母顺序的文件.是否有一些快速的方法listFile()来按字母顺序列出文件?

Ray*_*oal 208

listFiles无论有没有过滤器,该方法都不保证任何订单.

但是,它会返回一个数组,您可以对其进行排序Arrays.sort().

File[] files = XMLDirectory.listFiles(filter_xml_files);
Arrays.sort(files);
for(File _xml_file : files) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为它File是一个类似的类,默认情况下按字典顺序对路径名进行排序.如果要对它们进行不同的排序,可以定义自己的比较器.

如果您更喜欢使用Streams:

更现代的方法如下.要按字母顺序打印给定目录中所有文件的名称,请执行以下操作:

Files.list(Paths.get(dirName)).sorted().forEach(System.out::println)
Run Code Online (Sandbox Code Playgroud)

用System.out::println你想要的文件名替换.如果你只想要以"xml"do 结尾的文件名:

Files.list(Paths.get(dirName))
    .filter(s -> s.toString().endsWith(".xml"))
    .sorted()
    .forEach(System.out::println)
Run Code Online (Sandbox Code Playgroud)

再次,使用您想要的任何处理操作替换打印.

  • 这就是我期望它发挥作用的方式.大写字母出现在Unicode中的小写字母之前.Unix具有区分大小写的文件名,因此大写字母首先出现.如果在Windows上使用不区分大小写的文件名,则大写和小写名称将混合在一起.这完全符合预期.如果你想在Unix上使用Windows方式,请为`sort`提供一个比较器. (5认同)
  • @Thunder Rabbit,我的道歉!对不起,你是对的.我应该测试一下.我编辑了我的答案. (3认同)