我的任务是显示PC驱动器的所有目录/文件的树,
我有一个DirectoryNode
课,DefaultMutableTreeNode
File
字段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
,isHidden
和isDirectory
会返回false
我的某些有效目录目录(我使用的是Windows 10)。
答案 0 :(得分:1)
File.listFiles()
是违反Java惯例/良好做法的古老方法之一,永远不会从返回数组的方法返回null
。所以你必须检查null
。
来自文档:
表示文件和目录的抽象路径名数组 此抽象路径名表示的目录。阵列将是 如果目录为空则为空。如果此抽象返回null pathname不表示目录,或者发生I / O错误。
我已更改您的代码,使其更安全一些。如果从EDT调用它,您可能需要添加一些日志消息等,而不是将异常抛入必杀技。
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和Path
API以获得更好的解决方案。