-1

我的任务是显示 PC 驱动器的所有目录/文件的树,我有一个DirectoryNode扩展DefaultMutableTreeNodeFilefield的类directoryPath。我递归地构建节点:

public void buildDirectoryTree(){
    if(!directoryPath.isDirectory()){
            return;
    }

    for(File f : directoryPath.listFiles()){
        if(f.isHidden() || !f.exists()) continue;
        DirectoryNode newChild = new DirectoryNode(f);
        add(newChild);
        newChild.buildDirectoryTree();
    }
}

它适用于具体目录,但是当我尝试将它用于整个驱动器或一些大目录时,JTree这个节点根本不显示,我认为它遇到了特定目录的问题。我添加了存在和隐藏检查来跳过这个问题的根源,但它没有帮助。

此外,exists,isHiddenisDirectory返回false我的一些有效目录目录(我使用的是 Windows 10)。

4

1 回答 1

1

File.listFiles()是那些违反 Java 约定/良好实践的古老方法之一,即永远不会null从返回数组的方法返回。所以你必须检查null.

从文档:

一组抽象路径名,表示由该抽象路径名表示的目录中的文件和目录。如果目录为空,则数组将为空。如果此抽象路径名不表示目录,或者发生 I/O 错误,则返回 null。

我已更改您的代码以使其更安全一些。如果它是从 EDT 调用的,您可能想要添加一些日志消息等,而不是将异常抛出到 nirvana 中。

public void buildDirectoryTree() throws IOException {
    if (!directoryPath.isDirectory()) {
            return;
    }
    final File[] files = directoryPath.listFiles();
    if (files != null) {
        for (File f : files) {
            if (f.isHidden() || !f.exists()) continue;
            DirectoryNode newChild = new DirectoryNode(f);
            add(newChild);
            newChild.buildDirectoryTree();
        }
    } else {
        throw new IOException("Failed to list files for " + directoryPath);
    }
}

正如其他人所指出的,有更多的现代 API,它们的引入是有充分理由的。我建议阅读 NIO2 和PathAPI 以获得更好的解决方案。

于 2017-04-02T13:45:39.193 回答