Recursive Directory Traversal
ตัวอย่างโค้ด (Java 7+ NIO.2 - แนะนำ)
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class Demo {
public static void main(String[] args) throws IOException {
Path start = Paths.get("path/to/directory");
// Files.walkFileTree - robust, handles cycles, permissions
Files.walkFileTree(start, new SimpleFileVisitor() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
printIndent(file.getNameCount() - start.getNameCount());
System.out.println(file.getFileName());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
printIndent(dir.getNameCount() - start.getNameCount());
System.out.println("[" + dir.getFileName() + "]");
return FileVisitResult.CONTINUE;
}
private void printIndent(int level) {
for (int i = 0; i < level; i++) System.out.print("\t");
}
});
}
}
ตัวอย่างโค้ด (Legacy java.io.File - Recursive)
import java.io.File;
public class Demo {
static void printRecursive(File[] files, int index, int level) {
if (index == files.length) return;
for (int i = 0; i < level; i++) System.out.print("\t");
if (files[index].isFile()) {
System.out.println(files[index].getName());
} else if (files[index].isDirectory()) {
System.out.println("[" + files[index].getName() + "]");
printRecursive(files[index].listFiles(), 0, level + 1);
}
printRecursive(files, index + 1, level);
}
public static void main(String[] args) {
File dir = new File("path/to/directory");
if (dir.exists() && dir.isDirectory()) {
System.out.println("Files from: " + dir);
printRecursive(dir.listFiles(), 0, 0);
}
}
}
ผลลัพธ์ตัวอย่าง
[src]
[main]
[java]
Demo.java
Util.java
[resources]
config.properties
[test]
DemoTest.java
[build.gradle]
README.md
เปรียบเทียบ
| วิธี | ข้อดี | ข้อเสีย |
| Files.walkFileTree | จัดการ symbolic links, permissions, cycles ได้ดี | โค้ดยาวกว่า |
| Files.walk() (Java 8) | Stream API เรียบง่าย | อาจ OutOfMemoryError ถ้า directory ลึกมาก |
| File.listFiles() recursive | เข้าใจง่าย, ใช้ได้เก่า | ไม่ handle symlinks, null สำหรับ I/O error |