Hakemistopuiden läpikäynti Files.walk-metodilla
Luettele tiedostoja rekursiivisesti, suodata ne päätteen perusteella ja laske hakemistojen koot Files.walk-metodilla.
Hakemistopuiden läpikäynti Files.walk-metodilla on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.
Files.walk: yleiskatsaus
Files.walk(startPath) palauttaa laiskan Stream<Path>-virran, joka luettelee rekursiivisesti kaikki tiedostot ja hakemistot annetusta polusta alkaen. Läpikäynti tehdään syvyyssuuntaisesti, ja aloituspolku sisältyy tuloksiin.
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 automaticallySyvyyden rajoittaminen
Anna enimmäissyvyys syvän rekursion estämiseksi:
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);
}Suodattaminen tiedostotyypin perusteella
Yhdistä Files.isRegularFile()- tai Files.isDirectory()-metodiin suodattaaksesi tuloksia:
Path root = Path.of(".");
try (var stream = Files.walk(root)) {
long fileCount = stream
.filter(Files::isRegularFile)
.count();
System.out.println("Files: " + fileCount);
}Suodattaminen tiedostopäätteen perusteella
Etsi kaikki tietyn päätteen sisältävät tiedostot:
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);
}Hakemiston koon laskeminen
Laske yhteen kaikki hakemiston alla olevien tiedostojen koot:
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 ja Files.walk
Files.list(dir) luettelee vain yhden hakemiston välittömän sisällön (kuten ls). Files.walk käy läpi myös alihakemistot.
// Only immediate children:
try (var stream = Files.list(Path.of("/home/user"))) {
stream.forEach(System.out::println);
}Files.find attribuuttien mukaiseen hakuun
Files.find(root, depth, matcher) on tehokkaampi kuin walk ja filter yhdessä, kun haku perustuu tiedostoattribuutteihin:
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));
}Hakemistopuun poistaminen
Poista hakemisto ja kaikki sen sisältö käyttämällä yhdistelmää walk + sorted(reversed), jolloin syvimmällä olevat tiedostot poistetaan ensin:
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(); }
});
}Hakemistopuun kopioiminen
Käy lähdepuu läpi ja kopioi kukin tiedosto säilyttäen hakemistorakenteen:
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); }
});
}Käyttöoikeudettomien tiedostojen käsittely
Files.walk heittää IOException-poikkeuksen, jos se kohtaa hakemiston, jota ei voi lukea. Käytä FileVisitOption.FOLLOW_LINKS-asetusta varoen — symbolisten linkkien silmukat voivat aiheuttaa loputtoman rekursion.
try (var stream = Files.walk(Path.of("/"),
FileVisitOption.FOLLOW_LINKS)) { // caution: symlink loops
// ...
} catch (IOException e) {
System.err.println("Access error: " + e.getMessage());
}walkFileTree: tapahtumapohjainen läpikäynti
Kun tarvitset tarkempaa hallintaa (ennen vierailua, vierailun jälkeen ja virheenkäsittely), käytä Files.walkFileTree()-metodia yhdessä FileVisitor-rajapinnan kanssa:
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;
}
});Pikatarkistus
Mitä Files-metodia pitäisi käyttää, kun halutaan luetella VAIN hakemiston välitön sisältö ilman rekursiota?
Kertaus: Files.walk
Tärkeimmät asiat:
- Files.walk(root) — rekursiivinen laiska virta kaikista poluista
- Sulje virta aina try-with-resources-rakenteella
- Suodata Files.isRegularFile/isDirectory-metodeilla ja tiedostopäätteen perusteella endsWith-metodilla
- Files.list(dir) — vain välitön sisältö
- Files.find — tehokas attribuuttien perusteella tehtävä haku
- walkFileTree — tapahtumapohjainen läpikäynti ennen vierailua ja vierailun jälkeen kutsuttavilla takaisinsoitoilla
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 104
- Oppitunnit
- 374
Usein kysytyt kysymykset
Onko oppitunti ”Hakemistopuiden läpikäynti Files.walk-metodilla” ilmainen?
Kyllä – oppitunnin ”Hakemistopuiden läpikäynti Files.walk-metodilla” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Hakemistopuiden läpikäynti Files.walk-metodilla”?
Luettele tiedostoja rekursiivisesti, suodata ne päätteen perusteella ja laske hakemistojen koot Files.walk-metodilla. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Hakemistopuiden läpikäynti Files.walk-metodilla”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?
Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Path: tiedostojen sijaintien esittäminen
- Files-apuohjelma: lue, kirjoita, kopioi ja siirrä
- Hakemistopuiden läpikäynti Files.walk-metodilla
- WatchService: tiedostomuutosten valvonta