Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Liệt kê đệ quy tất cả file trong thư mục – Java

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ề null nếu không phải thư mục hoặc lỗi I/O – luôn check null
  • Files.walk ném IOException nế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