Рекурсивный поиск в каталоге файлов .mkv с использованием java

Несколько недель назад я использовал этот поток Захват определенных файлов в папке для захвата список файлов mkv из каталога, предоставленного третьей стороной. Однако структура каталога теперь изменилась, поэтому мне нужно рекурсивно пройтись по всем папкам, чтобы найти файлы .mkv.

Я слышал, что в общей библиотеке Apache есть метод FileUtils.listFiles(), который кажется многообещающим. Насколько я знаю, это по умолчанию возвращает коллекцию, а коллекции не гарантируют сохранения порядка (поскольку это видеофайлы .mkv, порядок очень важен). Есть ли у кого-нибудь из вас опыт работы с подобными вещами?


person austinthemassive    schedule 21.08.2013    source источник


Ответы (3)


Насколько глубока ваша структура каталогов?

Например, скажем, раньше ваши файлы находились в корневом каталоге, а теперь они находятся внутри 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());
                }
            }
        }
    }
person victorantunes    schedule 21.08.2013
comment
Это было очень полезно (мне никогда не нравились операторы for each/switch), потому что первые несколько частей каталога, с которыми я работаю, всегда предсказуемы (они связаны со временем). Приведенный выше код позволил мне перемещаться по непредсказуемой части структуры. Спасибо. - person austinthemassive; 22.08.2013

начиная с java 7 действительно нет необходимости использовать какую-либо стороннюю библиотеку для обхода файловых деревьев. взгляните на новый Path API. в частности, FileVisitor. вы можете легко написать файл, в котором перечислены только файлы, имена которых заканчиваются на «.mkv».

person radai    schedule 21.08.2013
comment
Я уже использую библиотеку Apache Commons для нескольких других шагов, поэтому в этой ситуации это имеет смысл. Спасибо за совет по FileVisitor, так как я уверен, что он пригодится в другой раз. - person austinthemassive; 21.08.2013

Использование FileUtils.listFiles(), если в каталоге много файлов, может привести к NPE или низкой производительности.

Если вам нужно упорядочить файл, используя метаданные файла, а не только по имени файла, вы можете использовать его между

и сделать что-то вроде

  • Создайте класс с необходимыми свойствами файла, используемого для заказа (класс FileMetadata), который реализует Comparable
  • Создайте пустой List<FileMetadata>
  • Перейдите в каталог и добавьте в свой List<>
  • Вызов Collections.sort(List‹>); (в этом вызове используется реализация FileMetadata's Comparable)

Другой способ, если вам нужен полный порядок в каталогах, хорошим решением может быть использование [упорядоченного TreeMap](http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html#TreeMap(java.util.Comparator)

person Luca Basso Ricci    schedule 21.08.2013