สมมติโฟลเดอร์ 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() Recursive | 1.0 | ยาว | พื้นฐาน | Basic |
| Files.walkFileTree | 7 | ปานกลาง | ดี | ควบคุมได้ละเอียด (skip, follow links) |
| Files.walk + Stream | 8 | สั้นที่สุด | ดี | Functional style, filter/map ง่าย |
ข้อควรระวัง
Files.walk()คืนค่า Stream ที่ต้อง close (ใช้ try-with-resources)- Symbolic links อาจทำให้ loop 無限 - ใช้
FileVisitOption.FOLLOW_LINKSอย่างระมัดระวัง - โฟลเดอร์ใหญ่มาก อาจกินหน่วยความจำสูง - walkFileTree ใช้หน่วยความจำน้อยกว่า