Merentas Pepohon Direktori dengan Files.walk
Senaraikan fail secara rekursif, tapis berdasarkan sambungan dan kira saiz direktori dengan Files.walk.
Merentas Pepohon Direktori dengan Files.walk ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Gambaran Keseluruhan Files.walk
Files.walk(startPath) mengembalikan Stream<Path> malas yang menyenaraikan semua fail dan direktori secara rekursif, bermula daripada laluan yang diberikan. Pelintasan dilakukan secara mendalam dahulu dan merangkumi laluan mula itu sendiri.
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 automaticallyMengehadkan Kedalaman
Berikan kedalaman maksimum untuk mengelakkan 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);
}Menapis mengikut Jenis Fail
Gabungkan dengan Files.isRegularFile() atau Files.isDirectory() untuk menapis:
Path root = Path.of(".");
try (var stream = Files.walk(root)) {
long fileCount = stream
.filter(Files::isRegularFile)
.count();
System.out.println("Files: " + fileCount);
}Menapis mengikut Sambungan
Cari semua fail dengan sambungan 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);
}Mengira Saiz Direktori
Jumlahkan saiz semua fail di bawah sesuatu 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 berbanding Files.walk
Files.list(dir) hanya menyenaraikan kandungan segera satu direktori (seperti ls). Files.walk merentasi subdirektori secara rekursif.
// Only immediate children:
try (var stream = Files.list(Path.of("/home/user"))) {
stream.forEach(System.out::println);
}Files.find untuk Carian Berasaskan Atribut
Files.find(root, depth, matcher) lebih cekap daripada walk+filter apabila membuat padanan berdasarkan atribut fail:
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));
}Memadam Pepohon Direktori
Gunakan walk + sorted(reversed) untuk memadam direktori dan semua kandungannya (fail terdalam 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 Pepohon Direktori
Telusuri pepohon sumber dan salin setiap fail sambil mengekalkan 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); }
});
}Mengendalikan Fail yang Tidak Boleh Dicapai
Files.walk melemparkan IOException jika menemui direktori yang tidak boleh dibaca. Gunakan FileVisitOption.FOLLOW_LINKS dengan berhati-hati — gelung pautan simbolik boleh menyebabkan rekursi tanpa penghujung.
try (var stream = Files.walk(Path.of("/"),
FileVisitOption.FOLLOW_LINKS)) { // caution: symlink loops
// ...
} catch (IOException e) {
System.err.println("Access error: " + e.getMessage());
}walkFileTree: Pelintasan Berasaskan Peristiwa
Untuk kawalan yang lebih terperinci (pra-pelintasan, pasca-pelintasan dan pengendalian ralat), 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;
}
});Semakan Pantas
Kaedah Files manakah yang patut digunakan untuk menyenaraikan ONLY anak segera sebuah direktori (tanpa rekursi)?
Imbas Kembali: Files.walk
Perkara penting:
- Files.walk(root) — Stream malas rekursif bagi semua laluan
- Sentiasa gunakan try-with-resources untuk menutup strim
- Tapis mengikut Files.isRegularFile/isDirectory; tapis mengikut sambungan dengan endsWith
- Files.list(dir) — hanya anak segera
- Files.find — carian berasaskan atribut yang cekap
- walkFileTree — berasaskan peristiwa dengan panggilan balik pra-/pasca-pelintasan
Pelajari Java dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Soalan Lazim
Adakah pelajaran “Merentas Pepohon Direktori dengan Files.walk” percuma?
Ya — teks penuh “Merentas Pepohon Direktori dengan Files.walk” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Merentas Pepohon Direktori dengan Files.walk”?
Senaraikan fail secara rekursif, tapis berdasarkan sambungan dan kira saiz direktori dengan Files.walk. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Java Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Merentas Pepohon Direktori dengan Files.walk” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Path: Mewakili Lokasi Fail
- Utiliti Files: Baca, Tulis, Salin, Alih
- Merentas Pepohon Direktori dengan Files.walk
- WatchService: Memantau Perubahan Fail