有没有使用 java 快速获取设备上所有音频文件的方法?

Is there a fast way to get all audio files on a device using java?

初学者 Java 程序员。我正在尝试在我的 mac(最终 Android)上制作一个简单的 mp3 播放器,我想让它自动识别所有音乐(mp3)已经在您的设备上。

我有一个简单的 for 循环设置,它从主目录开始并遍历所有其他目录以查找 mp3s。我还没有看到它完成循环,因为我总是不得不强行停止它,因为它持续了很长时间。我可以排除一些文件夹,因为在其中放置音乐是没有意义的,但我觉得有更好的方法。

有没有我可以研究的比 for 循环更快 and/or 更有效的方法?

我也很好奇 mac 中的查找器是如何工作的。例如,当我使用查找器查找 mac 上的所有 mp3 文件时,结果只需要几秒钟就可以显示出来,我只需输入一些搜索条件即可。如果有人能指出我如何完成与此类似的事情的方向,那就太好了,我会接受我能得到的任何意见!

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

首先,检查文件扩展名比检查文件是否可读更省时。

此外,您可以使用 Java 8 中添加的 Files.walkFileTree 方法。

在 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") && 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 class 是 FileVisitor 界面的简化实现,具有访问所有文件和 re-throw I/O 错误的默认行为。

如果出现 I/O 错误,我们仅将文件路径打印到默认错误流并继续文件处理。

如果没有错误,文件扩展名为“.mp3”(如上所述首先检查扩展名),并且文件是可读的,我们将文件路径打印到默认输出流(你也可以做其他事情,比如将其添加到媒体文件列表)