如何按字母顺序 File.list 文件?

2022-08-31 10:03:28

我有如下代码:

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

工作得很好,但似乎按相反的字母顺序列出文件。有没有一些快速的方法来告诉按字母顺序列出文件?FileFilterlistFiles()listFile()


答案 1

无论是否使用过滤器,该方法都不保证任何顺序。listFiles

但是,它确实返回一个数组,您可以使用 该数组进行排序。Arrays.sort()

File[] files = XMLDirectory.listFiles(filter_xml_files);
Arrays.sort(files);
for(File _xml_file : files) {
    ...
}

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

如果您更喜欢使用流:

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

Files.list(Paths.get(dirName)).sorted().forEach(System.out::println)

将 替换为要对文件名执行的任何操作。如果您只想要以 do 结尾的文件名:System.out::println"xml"

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

同样,将打印替换为所需的任何处理操作。


答案 2

在Java 8中:

Arrays.sort(files, (a, b) -> a.getName().compareTo(b.getName()));

相反的顺序:

Arrays.sort(files, (a, b) -> -a.getName().compareTo(b.getName()));

推荐