【问题标题】:Is there a fast way to get all audio files on a device using java?有没有一种快速的方法可以使用 java 获取设备上的所有音频文件?
【发布时间】:2020-08-15 07:46:59
【问题描述】:

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

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

我可以研究比for 循环更快和/或更有效的其他方法吗?

我也很好奇 mac 中的 finder 是如何工作的。例如,当我使用查找器在我的 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");
    }
}

【问题讨论】:

    标签: java algorithm file audio mp3


    【解决方案1】:

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

    此外,您可以为此使用 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 类是FileVisitor 接口的简化实现,默认行为是访问所有文件并重新引发 I/O 错误。

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

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

    【讨论】:

    • 感谢您的信息!我得看看你提到的 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());
        }
    }
    

    【讨论】:

    • 仅代码答案不是很有帮助。添加对代码作用的解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多