การเดินสำรวจต้นไม้ไดเรกทอรีด้วย Files.walk
แสดงรายการไฟล์แบบเรียกซ้ำ กรองตามส่วนขยาย และคำนวณขนาดไดเรกทอรีด้วย Files.walk
การเดินสำรวจต้นไม้ไดเรกทอรีด้วย Files.walk เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
ภาพรวม Files.walk
Files.walk(startPath) ส่งคืน Stream<Path> แบบประเมินผลเมื่อจำเป็น ซึ่งแสดงรายการไฟล์และไดเรกทอรีทั้งหมดแบบวนซ้ำ โดยเริ่มจาก Path ที่กำหนด ใช้การ遍历แบบความลึกก่อน และรวม Path เริ่มต้นไว้ด้วย
import java.nio.file.*;
import java.util.stream.*;
try (Stream<Path> stream = Files.walk(Path.of("/home/user/projects"))) {
stream.forEach(System.out::println);
} // stream and underlying resources closed automaticallyการจำกัดความลึก
ระบุความลึกสูงสุดเพื่อป้องกันการวนซ้ำที่ลึกเกินไป:
Path root = Path.of("/home/user/projects");
// Only immediate children (depth 1)
try (var stream = Files.walk(root, 1)) {
stream.filter(p -> !p.equals(root)) // exclude start path
.forEach(System.out::println);
}การกรองตามชนิดไฟล์
ใช้ร่วมกับ Files.isRegularFile() หรือ Files.isDirectory() เพื่อกรอง:
Path root = Path.of(".");
try (var stream = Files.walk(root)) {
long fileCount = stream
.filter(Files::isRegularFile)
.count();
System.out.println("Files: " + fileCount);
}การกรองตามนามสกุล
ค้นหาไฟล์ทั้งหมดที่มีนามสกุลเฉพาะ:
try (var stream = Files.walk(Path.of("/src"))) {
List<Path> javaFiles = stream
.filter(Files::isRegularFile)
.filter(p -> p.toString().endsWith(".java"))
.collect(Collectors.toList());
javaFiles.forEach(System.out::println);
}การคำนวณขนาดไดเรกทอรี
รวมขนาดไฟล์ทั้งหมดภายใต้ไดเรกทอรี:
try (var stream = Files.walk(Path.of("/home/user/data"))) {
long totalBytes = stream
.filter(Files::isRegularFile)
.mapToLong(p -> {
try { return Files.size(p); }
catch (IOException e) { return 0; }
})
.sum();
System.out.printf("Total: %.2f MB%n", totalBytes / 1_048_576.0);
}Files.list กับ Files.walk
Files.list(dir) แสดงเฉพาะเนื้อหาโดยตรงของไดเรกทอรีเดียว (คล้ายกับ ls) ส่วน Files.walk จะวนซ้ำเข้าไปในไดเรกทอรีย่อย
// Only immediate children:
try (var stream = Files.list(Path.of("/home/user"))) {
stream.forEach(System.out::println);
}Files.find สำหรับการค้นหาตามแอตทริบิวต์
Files.find(root, depth, matcher) มีประสิทธิภาพมากกว่า walk+filter เมื่อจับคู่ตามแอตทริบิวต์ของไฟล์:
import java.nio.file.attribute.BasicFileAttributes;
try (var stream = Files.find(
Path.of("/home/user"),
Integer.MAX_VALUE,
(p, attrs) -> attrs.isRegularFile() && attrs.size() > 1_000_000
)) {
stream.forEach(p -> System.out.println("Large file: " + p));
}การลบโครงสร้างไดเรกทอรี
ใช้ walk + sorted(reversed) เพื่อลบไดเรกทอรีและเนื้อหาทั้งหมด (เริ่มจากไฟล์ที่อยู่ลึกที่สุด):
Path toDelete = Path.of("/tmp/workdir");
try (var stream = Files.walk(toDelete)) {
stream.sorted(Comparator.reverseOrder())
.forEach(p -> {
try { Files.delete(p); }
catch (IOException e) { e.printStackTrace(); }
});
}การคัดลอกโครงสร้างไดเรกทอรี
วนดูโครงสร้างต้นทางและคัดลอกแต่ละไฟล์ โดยคงโครงสร้างไดเรกทอรีไว้:
Path src = Path.of("/source"), dst = Path.of("/destination");
try (var stream = Files.walk(src)) {
stream.forEach(p -> {
try {
Path target = dst.resolve(src.relativize(p));
if (Files.isDirectory(p)) Files.createDirectories(target);
else Files.copy(p, target, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) { throw new RuntimeException(e); }
});
}การจัดการไฟล์ที่เข้าถึงไม่ได้
Files.walk จะแจ้ง IOException หากพบไดเรกทอรีที่อ่านไม่ได้ ใช้ FileVisitOption.FOLLOW_LINKS อย่างระมัดระวัง — วงจรของลิงก์สัญลักษณ์อาจทำให้เกิดการวนซ้ำไม่สิ้นสุด
try (var stream = Files.walk(Path.of("/"),
FileVisitOption.FOLLOW_LINKS)) { // caution: symlink loops
// ...
} catch (IOException e) {
System.err.println("Access error: " + e.getMessage());
}walkFileTree: การวนดูแบบอิงเหตุการณ์
หากต้องการควบคุมได้ละเอียดขึ้น (ก่อนเยี่ยมชม หลังเยี่ยมชม และการจัดการข้อผิดพลาด) ให้ใช้ Files.walkFileTree() ร่วมกับ FileVisitor:
Files.walkFileTree(Path.of("/home/user"), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
System.out.println("File: " + file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
System.out.println("Dir: " + dir);
return FileVisitResult.CONTINUE;
}
});ตรวจสอบความเข้าใจอย่างรวดเร็ว
ควรใช้เมธอดใดของ Files เพื่อแสดงรายการเฉพาะรายการย่อยโดยตรงของไดเรกทอรี (ไม่วนซ้ำ)
ทบทวน: Files.walk
ประเด็นสำคัญ:
- Files.walk(root) — Stream แบบประเมินผลเมื่อจำเป็นของ Path ทั้งหมดแบบวนซ้ำ
- ใช้ try-with-resources เสมอเพื่อปิดสตรีม
- กรองด้วย Files.isRegularFile/isDirectory; กรองตามนามสกุลด้วย endsWith
- Files.list(dir) — เฉพาะรายการย่อยโดยตรง
- Files.find — การค้นหาตามแอตทริบิวต์ที่มีประสิทธิภาพ
- walkFileTree — การวนดูแบบอิงเหตุการณ์พร้อมการเรียกกลับก่อนและหลังเยี่ยมชม
คำถามที่พบบ่อย
บทเรียน “การเดินสำรวจต้นไม้ไดเรกทอรีด้วย Files.walk” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเดินสำรวจต้นไม้ไดเรกทอรีด้วย Files.walk” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเดินสำรวจต้นไม้ไดเรกทอรีด้วย Files.walk”
แสดงรายการไฟล์แบบเรียกซ้ำ กรองตามส่วนขยาย และคำนวณขนาดไดเรกทอรีด้วย Files.walk คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การเดินสำรวจต้นไม้ไดเรกทอรีด้วย Files.walk” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Path: การแทนตำแหน่งไฟล์
- ยูทิลิตี Files: อ่าน เขียน คัดลอก ย้าย
- การเดินสำรวจต้นไม้ไดเรกทอรีด้วย Files.walk
- WatchService: การตรวจติดตามการเปลี่ยนแปลงไฟล์