Есть ли быстрый способ получить все аудиофайлы на устройстве с использованием Java?

#java #algorithm #file #audio #mp3

#java #алгоритм #файл #Аудио #mp3

Вопрос:

Начинающий Java-программист здесь. Я пытаюсь создать простой mp3 проигрыватель на моем Mac (и, в конечном счете, Android), и я хотел бы, чтобы он автоматически распознавал всю музыку ( mp3 ), которая уже есть на вашем устройстве.

У меня есть простая настройка цикла for, которая начинается с домашнего каталога и перебирает все другие каталоги в поисках mp3s . Я еще не видел, чтобы это завершало цикл, поскольку мне всегда приходится принудительно останавливать его, потому что это продолжается так долго. Я мог бы просто исключить некоторые папки, потому что размещение музыки в них просто не имело бы смысла, но я чувствую, что есть подход получше.

Есть ли какие-либо другие методы, которые я мог бы изучить, которые быстрее и / или эффективнее, чем for цикл?

Мне также любопытно, как работает finder на Mac. Например, когда я использую Finder для поиска всех mp3 файлов на моем Mac, отображение результатов занимает всего пару секунд, и все, что мне нужно, это ввести некоторые критерии поиска. Если бы кто-нибудь мог указать мне, как выполнить что-то подобное этому, что было бы здорово, я приму любой ввод, который смогу получить!

 public static void findAudio(File currentDir) {
    File[] filesInDir = currentDir.listFiles();
    if (filesInDir != null){
        if (filesInDir.length == 0){
            return;
        }
        else {
            for (File file : filesInDir) {
                if (!file.isHidden()) {
                    if (file.isDirectory()) {
                        findAudio(file);
                    }
                    if (file.canRead()) {
                        if (file.getName().endsWith(".mp3")) {
                            System.out.println(file.getPath());
                        }
                    }
                }
            }
        }
    }
    else {
        System.out.println(currentDir.getPath()   " is null -- skipping");
    }
}
  

Ответ №1:

Перво-наперво, проверка расширения файла занимает меньше времени, чем проверка того, доступен ли файл для чтения.

Кроме того, вы можете использовать Files.walkFileTree метод, добавленный в Java 8 для этого.

На сайте oracle есть руководство по его использованию: https://docs.oracle.com/javase/tutorial/essential/io/walk.html

Код будет выглядеть примерно так:

 Files.walkFileTree(Paths.get(sourcePath), new SimpleFileVisitor<>() {
    @Override
    public FileVisitResult visitFile(Path filePath, BasicFileAttributes attrs) {
        if (filePath.toString().endsWith(".mp3") amp;amp; filePath.toFile().canRead()) {
            System.out.println(filePath.toString());
        }
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) {
        System.err.println("Failed reading ""   file.toString()   "" -- skipping");
        return FileVisitResult.CONTINUE;
    }
});
  

SimpleFileVisitor класс — это упрощенная реализация FileVisitor интерфейса с поведением по умолчанию для просмотра всех файлов и повторного запуска ошибок ввода-вывода.

В случае ошибки ввода-вывода мы только выводим путь к файлу в поток ошибок по умолчанию и продолжаем обработку файла.

В случае отсутствия ошибок расширение файла равно «.mp3» (сначала проверяем расширение, как указано выше), и файл доступен для чтения, мы печатаем путь к файлу выходного потока по умолчанию (вы также можете сделать другие вещи, например, добавить его в список медиафайлов)

Комментарии:

1. Спасибо за информацию! Мне придется заглянуть в упомянутый вами метод Files.walkFileTree

Ответ №2:

 import java.io.*;

public static void extract(String p) {
    File f = new File(p);
    File l[] = f.listFiles();
    for(File x : l){
        if (x==null) return;
        if (x.isHidden()||!x.canRead()) continue;
        if (x.isDirectory()) extract(x.getPath());
        else if (x.getName().endsWith(".mp3"))
        System.out.println(x.getPath() "\" x.getName());
    }
}
  

Комментарии:

1. Ответы только с кодом не очень полезны. Добавьте объяснение к тому, что делает код