不知道你想如何表示树?无论如何,这里有一个例子,使用递归扫描整个子树。文件和目录被视为一样。注意,
File.listFiles()对非目录返回null。
public static void main(String[] args) {
Collection all = new ArrayList();
addTree(new File("."), all);
System.out.println(all);
}
static void addTree(File file, Collection all) {
File[] children = file.listFiles();
if (children != null) {
for (File child : children) {
all.add(child);
addTree(child, all);
}
}
}
Java 7提供了几个改进。例如,DirectoryStream每次提供一个结果 – 调用者不再需要等待所有I / O操作在执行之前完成。这允许增量GUI更新,提前取消等。
static void addTree(Path directory, Collection all)
throws IOException {
try (DirectoryStream ds = Files.newDirectoryStream(directory)) {
for (Path child : ds) {
all.add(child);
if (Files.isDirectory(child)) {
addTree(child, all);
}
}
}
}
请注意,可怕的null返回值已被替换为IOException。
Java 7还提供了一个tree walker:
static void addTree(Path directory, final Collection all)
throws IOException {
Files.walkFileTree(directory, new SimpleFileVisitor() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
all.add(file);
return FileVisitResult.CONTINUE;
}
});
}