File.list() 与 File.listFiles()

Posted

技术标签:

【中文标题】File.list() 与 File.listFiles()【英文标题】:File.list() vs File.listFiles() 【发布时间】:2013-02-28 11:15:02 【问题描述】:

我的问题是:如果这两个函数有什么不同?我的意思是我知道它们返回的东西不同,但是一个元素中的元素数量是否可能与第二个元素中的元素数量不同。我会尽力解释。我为我的一个班级实现了 TreeModel,试图基于 JTree 对 PC 上的文件进行很好的查看。所以这里是它的一部分:

public Object getChild(Object parent, int index) 
        File[] children = ((File) parent).listFiles();
        if(children == null || index < 0 || index >= children.length) 
            return null;
        

        File result = new MyFile(children[index]);
        return result;


public int getChildCount(Object parent) 
        //---
        //String[] children = ((File)parent).list();
        File[] children = ((File)parent).listFiles();
        //---

        if(children == null) 
            return 0;
        
        return children.length;

我标记了有趣的代码。如果我为这个注释的行更改了这两行,有时我会在加载 TreeModel 后得到NullPointerExceptionjtree.setModel(treeModel);。这个未注释不会造成任何麻烦。我检查了文档,它没有说任何异常,包括两种方法都返回 null 。这是怎么回事?

【问题讨论】:

它们可能返回不同结果的唯一原因是文件系统的状态在调用之间发生了变化(添加/删除了文件)。您老从 File#listFiles 获得 NPE 的唯一原因是文件对象表示的路径不存在或不是目录 【参考方案1】:

如前所述,但仅在 post from D.R 中的 cmets 中进行了澄清

list 方法返回带有文件名的String array(文件和 目录)

listFiles返回array of class File 同样

查看文档页面,例如。 https://docs.oracle.com/javase/7/docs/api/java/io/File.html

String[] list() 返回一个字符串数组,命名此抽象路径名表示的目录中的文件和目录。

File[] listFiles() 返回一个抽象路径名数组,表示此抽象路径名所表示的目录中的文件。

我不确定为什么这两种方法都存在,可能字符串数组会比文件数组更快,内存消耗更少

【讨论】:

【参考方案2】:

两种方法的作用基本相同,详情请查看http://www.docjar.com/html/api/java/io/File.java.html。

【讨论】:

所以问题是:这个模型是怎么回事? 也许您只是幸运地使用了 listFiles()?一种方法基于另一种方法,因此它们应该返回一致的数据。如果您有孩子== null-if,您究竟从哪里获得NPE?也许父母为空?哪个变量为空? 相同...除了listFiles()方法返回File[],而list()方法只返回文件names(即String[] )。

以上是关于File.list() 与 File.listFiles()的主要内容,如果未能解决你的问题,请参考以下文章

函数 write() 与数字符号不一致

函数write()与数字表示法不一致

JAVA File对象相关知识点

json模块下abspath()查找文件绝对路径与join()路径嫁接获取相对路径的差别

Clover file list

批量移动文件