Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

โปรแกรม Java แสดงไฟล์ทั้งหมดใน Directory และ Subdirectory แบบ Recursive

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