0Pricing
Java Academy · Pelajaran

Menelusuri Pohon Direktori dengan Files.walk

Buat daftar file secara rekursif, saring berdasarkan ekstensi, dan hitung ukuran direktori dengan Files.walk.

Menelusuri Pohon Direktori dengan Files.walk adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Ikhtisar Files.walk

Files.walk(startPath) mengembalikan Stream<Path> tertunda yang mencantumkan semua berkas dan direktori secara rekursif mulai dari jalur yang diberikan. Penelusuran dilakukan secara mendalam lebih dulu dan mencakup jalur awal.

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

Membatasi Kedalaman

Berikan kedalaman maksimum untuk mencegah rekursi yang terlalu dalam:

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);
}

Memfilter berdasarkan Jenis Berkas

Gabungkan dengan Files.isRegularFile() atau Files.isDirectory() untuk melakukan penyaringan:

Path root = Path.of(".");

try (var stream = Files.walk(root)) {
    long fileCount = stream
        .filter(Files::isRegularFile)
        .count();
    System.out.println("Files: " + fileCount);
}

Memfilter berdasarkan Ekstensi

Temukan semua berkas dengan ekstensi tertentu:

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);
}

Menghitung Ukuran Direktori

Jumlahkan ukuran semua berkas di bawah suatu direktori:

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 vs Files.walk

Files.list(dir) hanya mencantumkan isi langsung dari satu direktori (seperti ls). Files.walk menelusuri subdirektori secara rekursif.

// Only immediate children:
try (var stream = Files.list(Path.of("/home/user"))) {
    stream.forEach(System.out::println);
}

Files.find untuk Pencarian berdasarkan Atribut

Files.find(root, depth, matcher) lebih efisien daripada walk+filter saat pencarian dilakukan berdasarkan atribut berkas:

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));
}

Menghapus Pohon Direktori

Gunakan walk + sorted(reversed) untuk menghapus direktori beserta seluruh isinya (berkas terdalam terlebih dahulu):

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(); }
          });
}

Menyalin Pohon Direktori

Telusuri pohon sumber dan salin setiap berkas sambil mempertahankan struktur direktori:

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); }
    });
}

Menangani Berkas yang Tidak Dapat Diakses

Files.walk melempar IOException jika menemukan direktori yang tidak dapat dibaca. Gunakan FileVisitOption.FOLLOW_LINKS dengan hati-hati — perulangan tautan simbolis dapat menyebabkan rekursi tanpa akhir.

try (var stream = Files.walk(Path.of("/"),
        FileVisitOption.FOLLOW_LINKS)) { // caution: symlink loops
    // ...
} catch (IOException e) {
    System.err.println("Access error: " + e.getMessage());
}

walkFileTree: Penelusuran Berbasis Peristiwa

Untuk mendapatkan kendali yang lebih terperinci (kunjungan awal, kunjungan akhir, penanganan kesalahan), gunakan Files.walkFileTree() dengan 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;
    }
});

Pemeriksaan Singkat

Metode Files apa yang sebaiknya digunakan untuk hanya mencantumkan anak langsung suatu direktori (tanpa rekursi)?

Ringkasan: Files.walk

Pokok-pokok penting:

  • Files.walk(root) — aliran Stream tertunda yang rekursif untuk semua jalur
  • Selalu gunakan try-dengan-sumber daya untuk menutup aliran
  • Saring berdasarkan Files.isRegularFile/isDirectory; saring berdasarkan ekstensi dengan endsWith
  • Files.list(dir) — hanya anak langsung
  • Files.find — pencarian berdasarkan atribut yang efisien
  • walkFileTree — berbasis peristiwa dengan panggilan balik kunjungan awal/akhir

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menelusuri Pohon Direktori dengan Files.walk” gratis?

Ya — teks lengkap “Menelusuri Pohon Direktori dengan Files.walk” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menelusuri Pohon Direktori dengan Files.walk”?

Buat daftar file secara rekursif, saring berdasarkan ekstensi, dan hitung ukuran direktori dengan Files.walk. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Menelusuri Pohon Direktori dengan Files.walk” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Path: Merepresentasikan Lokasi File
  2. Utilitas Files: Membaca, Menulis, Menyalin, Memindahkan
  3. Menelusuri Pohon Direktori dengan Files.walk
  4. WatchService: Memantau Perubahan File
← Kembali ke Java Academy