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 automaticallyMembatasi 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
- Path: Merepresentasikan Lokasi File
- Utilitas Files: Membaca, Menulis, Menyalin, Memindahkan
- Menelusuri Pohon Direktori dengan Files.walk
- WatchService: Memantau Perubahan File