【发布时间】:2015-08-31 13:42:43
【问题描述】:
为了获取指定目录中包含的所有文件并根据某些扩展名,我使用Apache Commons IO库中FileUtils类的方法listFiles,如下代码示例所示。
ArrayList<String> wildcards = new ArrayList<>();
wildcards.add("*.cpp");
wildcards.add("*.h");
wildcards.add("*.txt");
File dir = new File("/path/to/dir");
Collection<File> found = FileUtils.listFiles(
dir,
new WildcardFileFilter(wildcards, IOCase.SENSITIVE),
DirectoryFileFilter.DIRECTORY);
List<File> files = new ArrayList<>(found);
生成的Collection<File> 中的项目顺序在不同的操作系统中有所不同,因此我将根据以下规则对它们(即包装列表files)进行排序。
- 目录应列在文件之前。
- 排序例程应按目录对文件进行分组。
例子:
/path/to/dir/first/subpath/main.cpp
/path/to/dir/first/subpath/utils.cpp
/path/to/dir/first/subpath/utils.h
/path/to/dir/first/main.cpp
/path/to/dir/first/utils.cpp
/path/to/dir/first/utils.h
/path/to/dir/second/main.cpp
/path/to/dir/second/utils.cpp
/path/to/dir/second/utils.h
/path/to/dir/README.txt
【问题讨论】:
-
按文件的完整路径名对文件进行排序应该可以解决问题,不是吗?
-
@ammoQ:很遗憾,没有,因为例如
/path/to/dir/README.txt会小于/path/to/dir/second/utils.h,如果我按它们的完整路径名对它们进行排序。 -
嗯,这取决于您是否将
README.txt视为dir节点的叶子节点,该节点位于second节点之前。如果你想首先拥有目录,它与深度优先不同,确切地说。 -
您可以在 apache-common-io lib 中使用以下比较器之一:commons.apache.org/proper/commons-io/apidocs/org/apache/commons/…。尝试 DefaultFileComparator 或 DirectoryFileComparator 或 PathFileComparator 或其中少数的复合比较器 - commons.apache.org/proper/commons-io/apidocs/org/apache/commons/…
-
所以在你的比较例程中,按路径(不带文件名)排序,如果路径相等,则按文件名。
标签: java algorithm sorting apache-commons comparator