Не знаете, как вы хотите изобразить дерево? В любом случае, вот пример, который сканирует все поддерево с помощью рекурсии. Файлы и каталоги обрабатываются одинаково. Обратите внимание, что File.listFiles () возвращает ноль для не-каталогов.
public static void main(String[] args) {
Collection<File> all = new ArrayList<File>();
addTree(new File("."), all);
System.out.println(all);
}
static void addTree(File file, Collection<File> all) {
File[] children = file.listFiles();
if (children != null) {
for (File child : children) {
all.add(child);
addTree(child, all);
}
}
}
Java 7 предлагает несколько улучшений. Например, DirectoryStream предоставляет один результат за раз - вызывающему больше не нужно ждать завершения всех операций ввода-вывода, прежде чем действовать. Это позволяет постепенно обновлять GUI, досрочно отменять и т. Д.
static void addTree(Path directory, Collection<Path> all)
throws IOException {
try (DirectoryStream<Path> ds = Files.newDirectoryStream(directory)) {
for (Path child : ds) {
all.add(child);
if (Files.isDirectory(child)) {
addTree(child, all);
}
}
}
}
Обратите внимание, что страшное нулевое возвращаемое значение было заменено IOException.
Java 7 также предлагает обходчик деревьев :
static void addTree(Path directory, final Collection<Path> all)
throws IOException {
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
all.add(file);
return FileVisitResult.CONTINUE;
}
});
}