【问题标题】:How to read all mp3 files in my computer in java?如何用java读取我电脑中的所有mp3文件?
【发布时间】:2013-10-15 17:57:17
【问题描述】:

我的目标是获取我计算机中所有 mp3 文件的列表(以下代码在 c: 目录中)。但是当我运行这段代码时,我得到了NullPointerException。但适用于其他目录,如(e:)。

public class music {

public static void main(String args[]){
    extract("c:\\");

}
public static void extract(String p){
    File f=new File(p);
    File l[]=f.listFiles();

    for(File x:l)
    {
        //System.out.println(x.getName());

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

    }

}
}

【问题讨论】:

  • 我可以对DirectoryStream<Path>感兴趣吗?
  • 异常来自哪一行?
  • docs.oracle.com/javase/6/docs/api/java/io/… 至少以 listRoots 开头,而不是 c:\\
  • 您能否在此问题中发布您的堆栈跟踪。请在 javaDoc 中看到 listFiles 在以下情况下可以返回 null:“...此抽象路径名不表示目录,或者发生 I/O 错误。”
  • 谢谢大家...我没有检查空列表...这就是问题...得到了输出:)

标签: java exception file-io nullpointerexception mp3


【解决方案1】:

当你的代码试图访问一些 not real directories like c:\Documents and Settings 时,我得到了 NPE。

要解决此问题,您可以跳过对从 listFiles() 返回 null 的目录进行迭代,如下代码所示:

public static void main(String args[]) {
    extract(new File("c:\\"));

}

public static void extract(File dir) {
    File l[] = dir.listFiles();

    if (l == null) {
        System.out.println("[skipped] " + dir);
        return;
    }

    for (File x : l) {
        if (x.isDirectory())
            extract(x);
        if (x.isHidden() || !x.canRead()) 
            continue;
        else if (x.getName().endsWith(".mp3"))
            System.out.println(x.getPath());//name should be included in path
    }

}

【讨论】:

    【解决方案2】:

    在 Windows 操作系统中。 C驱动器(Windows驱动器)有Windows在运行时使用的系统文件和一些被Windows锁定的文件。当您的代码尝试通过异常访问该文件时。
    尝试使用其他 C:// 驱动器运行此代码.. 对此文件添加 Try catch 或 null 检查:

    import java.io.*;
    public class Music {
        public static void main(String args[]){
            extract("c:\\");
        }
        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());
            }
        }
    }
    

    【讨论】:

    • @Spartan 我问的是因为for (Type x : nullReference) if(...) 会在执行if 之前抛出NPE。
    • @pshemo 但在 for 循环中。不检查列表元素的值。数数
    • lf.listFiles() 的结果,所以如果它返回null 而不是放在f 循环中的文件列表for(File x:l) 将在进入其主体之前抛出NPE。
    • 我不确定您所说的 and store in list[] 是什么意思。您能否发布完整的工作解决方案代码,以便我测试它,因为我无法用您的答案解决这个问题。
    • 如果某些东西不起作用,则意味着它有问题。无论如何,我会假设 OP 和你有类似的操作系统,所以如果你的方法解决了他的问题,那就没问题了,不需要进一步讨论。公平地说,最好的解决方案可能是结合我们的两个答案。
    猜你喜欢
    • 2017-06-23
    • 2012-07-05
    • 2010-12-23
    • 2018-02-23
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多