0

几周前,我使用这个线程Grabbing specific files in a folder从第三方提供的目录中获取 mkv 文件列表。但是,目录的结构现在已经改变,所以我需要递归地遍历所有文件夹以找到 .mkv 文件。

我听说 Apache 公共库有 FileUtils.listFiles() 方法,这似乎很有希望。据我所知,默认情况下会返回一个集合,并且集合不保证保留顺序(因为这些是 .mkv 视频文件,所以顺序非常重要)。你们中有人有过这种事情的经验吗?

4

3 回答 3

1

从 java 7 开始,实际上不需要使用任何 3rd 方库来遍历文件树。看看新的 Path API。特别是FileVisitor。您可以轻松编写一个仅列出名称以“.mkv”结尾的文件

于 2013-08-21T17:00:47.953 回答
1

使用FileUtils.listFiles(),如果目录里面有很多文件,可能会遇到 NPE 或性能不佳。

如果您需要使用文件的元数据来订购文件,而不仅仅是文件名,您可以使用两者之间的一个

并做类似的事情

  • 创建一个具有用于订单(类FileMetadata)的必要文件属性的类,该类实现Comparable
  • 创建一个空List<FileMetadata>
  • 遍历目录并添加到您的List<>
  • 调用 Collections.sort(List<>); (此调用使用FileMetadata's Comparable实现)

另一种方式,如果您需要沿目录进行总排序,一个好的解决方案可以使用 [ordered TreeMap]( http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html#TreeMap( java.util.Comparator)

于 2013-08-21T17:08:37.900 回答
1

你的目录结构有多深?

例如,假设之前您的文件位于根目录中,而现在它们位于 root/domain1、root/domain2、root/domain3 等中。

为此,我写了一些相当简单的东西。

    String rootPath = <path_to_root>;
    File[] domains = new File(rootPath).listFiles();
    for (File domain : domains) {
        if (domain.isDirectory()) {
            File[] files = new File(domain.getAbsolutePath()).listFiles();
            for (File file : files) {
                if (file.isFile() && file.getAbsolutePath().endsWith(".mkv")) {
                    System.out.println(file.getAbsolutePath());
                }
            }
        }
    }
于 2013-08-21T17:18:49.630 回答