0Pricing
Java Academy · บทเรียน

การเดินสำรวจต้นไม้ไดเรกทอรีด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Path: การแทนตำแหน่งไฟล์
  2. ยูทิลิตี Files: อ่าน เขียน คัดลอก ย้าย
  3. การเดินสำรวจต้นไม้ไดเรกทอรีด้วย Files.walk
  4. WatchService: การตรวจติดตามการเปลี่ยนแปลงไฟล์
← กลับไปที่ Java Academy