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

标签 java algorithm file audio mp3

初级 Java 程序员在这里。我正在尝试制作一个简单的 mp3我的 Mac(最终是 Android)上的播放器,我想让它自动识别您设备上已经存在的所有音乐(mp3)。
我有一个简单的 for 循环设置,它从主目录开始,遍历所有其他目录以查找 mp3s .我还没有看到它完成循环,因为我总是不得不强制停止它,因为它持续了很长时间。我可以排除一些文件夹,因为在其中放置音乐没有意义,但我觉得有更好的方法。
有没有比 for 更快和/或更有效的其他方法?环形?
我也很好奇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");
    }
}

最佳答案

首先,检查文件扩展名比检查文件是否可读花费更少的时间。
此外,您可以使用 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") && 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 的简化实现具有默认行为的接口(interface)以访问所有文件并重新引发 I/O 错误。
如果出现 I/O 错误,我们仅将文件路径打印到默认错误流并继续文件处理。
如果没有错误,文件扩展名是“.mp3”(如上所述首先检查扩展名),并且文件是可读的,我们将文件路径打印到默认输出流(您也可以做其他事情,例如将其添加到媒体文件列表)

关于java - 有没有一种快速的方法可以使用 java 获取设备上的所有音频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63423781/

相关文章:

java - 打印小字母的 ascii 代码

java - 如何使用 JSP/Servlets 应用程序在特定时间运行服务?

java - Spring自动从包中加载上下文文件

python - 一组开关和灯的最大流量

python - 在 Python 中区分空行和文件结尾

python - 删除文件python的空白空间

c - 如何在c中逐行读取?

Java Spring引导上传文件并使用表单提交将其他数据作为ajax发送

c++ - 如何检测内存访问冲突和/或内存竞争条件?

c# - 你能告诉我如何从声音中检测事件,无论其波或频谱的一部分是否超过特定数量的阈值?