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

โปรแกรม Java แสดงรายการไฟล์ทั้งหมดในโฟลเดอร์แบบ Recursive

สมมติโฟลเดอร์ ExampleDirectory ในไดรฟ์ D มี 7 ไฟล์ และ 2 โฟลเดอร์ย่อย (SampleDirectory1, SampleDirectory2) แต่ละโฟลเดอร์มีไฟล์ 2 ไฟล์

โค้ดแบบ Recursive (Java IO แบบเก่า)


import java.io.File;
import java.io.IOException;

public class ListOfFiles {
    public static void listOfFiles(File dirPath) {
        File[] filesList = dirPath.listFiles();
        if (filesList == null) return;
        
        for (File file : filesList) {
            if (file.isFile()) {
                System.out.println("File path: " + file.getName());
            } else {
                listOfFiles(file); // recursive
            }
        }
    }
    
    public static void main(String[] args) throws IOException {
        File dir = new File("D:\\ExampleDirectory");
        listOfFiles(dir);
    }
}

ผลลัพธ์


File path: cassandra_logo.jpg
File path: cat.jpg
File path: coffeescript_logo.jpg
File path: javafx_logo.jpg
File path: SampleFile1.txt
File path: SampleFile2.txt
File path: SampleFile4.txt
File path: SapmleFile3.txt
File path: SampleHiddenfile1.txt
File path: SampleHiddenfile2.txt
File path: SampleHiddenfile3.txt

วิธีทันสมัย: Java NIO.2 (Files.walkFileTree) - Java 7+


import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class ListFilesNIO {
    public static void main(String[] args) throws IOException {
        Path dir = Paths.get("D:\\ExampleDirectory");
        
        Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                System.out.println("File: " + file.toAbsolutePath());
                return FileVisitResult.CONTINUE;
            }
        });
    }
}

วิธีสั้นที่สุด: Java 8+ Stream API


import java.io.IOException;
import java.nio.file.*;
import java.util.stream.Stream;

public class ListFilesStream {
    public static void main(String[] args) throws IOException {
        Path dir = Paths.get("D:\\ExampleDirectory");
        
        try (Stream<Path> stream = Files.walk(dir)) {
            stream.filter(Files::isRegularFile)
                  .forEach(System.out::println);
        }
    }
}

ตัวอย่าง: แสดงข้อมูลเพิ่มเติม (ขนาด, วันที่แก้ไข)


try (Stream<Path> stream = Files.walk(dir)) {
    stream.filter(Files::isRegularFile)
          .forEach(path -> {
              try {
                  BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
                  System.out.printf("%s | %,d bytes | %s%n",
                      path.getFileName(),
                      attrs.size(),
                      attrs.lastModifiedTime());
              } catch (IOException e) {
                  System.err.println("Error reading: " + path);
              }
          });
}

ตัวอย่าง: กรองไฟล์เฉพาะ副檔名 .txt


stream.filter(Files::isRegularFile)
      .filter(p -> p.toString().endsWith(".txt"))
      .forEach(System.out::println);

การเปรียบเทียบ

วิธีJava Versionความยาวโค้ดประสิทธิภาพFeatures
File.listFiles() Recursive1.0ยาวพื้นฐานBasic
Files.walkFileTree7ปานกลางดีควบคุมได้ละเอียด (skip, follow links)
Files.walk + Stream8สั้นที่สุดดีFunctional style, filter/map ง่าย

ข้อควรระวัง

  • Files.walk() คืนค่า Stream ที่ต้อง close (ใช้ try-with-resources)
  • Symbolic links อาจทำให้ loop 無限 - ใช้ FileVisitOption.FOLLOW_LINKS อย่างระมัดระวัง
  • โฟลเดอร์ใหญ่มาก อาจกินหน่วยความจำสูง - walkFileTree ใช้หน่วยความจำน้อยกว่า