Duyệt cây thư mục, in đường dẫn file (bỏ qua thư mục).
Cách 1: java.io.File (Legacy)
import java.io.File;
import java.io.IOException;
public class ListFilesRecursiveIO {
public static void listFiles(File dir) {
File[] files = dir.listFiles();
if (files == null) return;
for (File file : files) {
if (file.isFile()) {
System.out.println(file.getAbsolutePath());
} else {
listFiles(file); // đệ quy
}
}
}
public static void main(String[] args) throws IOException {
File root = new File("D:/ExampleDirectory");
listFiles(root);
}
}
Cách 2: java.nio.Files.walk (Java 8+) – Khuyên dùng
import java.nio.file.*;
import java.io.IOException;
public class ListFilesNIO {
public static void main(String[] args) throws IOException {
Path root = Paths.get("D:/ExampleDirectory");
// Stream lazy, hiệu quả bộ nhớ
Files.walk(root)
.filter(Files::isRegularFile)
.forEach(System.out::println);
}
}
Cách 3: Files.walkFileTree (Java 7+) – Kiểm soát chi tiết
Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.err.println("Lỗi truy cập: " + file + " - " + exc.getMessage());
return FileVisitResult.CONTINUE;
}
});
Kết quả mẫu
D:\ExampleDirectory\file1.txt
D:\ExampleDirectory\file2.jpg
D:\ExampleDirectory\SubDir1\sub1.txt
D:\ExampleDirectory\SubDir1\sub2.txt
D:\ExampleDirectory\SubDir2\sub3.txt
D:\ExampleDirectory\SubDir2\sub4.txt
Lọc file (ví dụ: chỉ .txt)
// NIO Stream
Files.walk(root)
.filter(p -> p.toString().endsWith(".txt"))
.filter(Files::isRegularFile)
.forEach(System.out::println);
// Legacy
if (file.isFile() && file.getName().endsWith(".txt")) { ... }
⚠️ Lưu ý
listFiles()trả vềnullnếu không phải thư mục hoặc lỗi I/O – luôn check nullFiles.walknémIOExceptionnếu gặp lỗi truy cập – xử lý try-catch- Thư mục lớn: NIO streaming tránh load toàn bộ vào RAM