Java Academy · Lektion

Gennemløb af mappetræer med Files.walk

Vis filer rekursivt, filtrér efter filtypenavn, og beregn mappestørrelser med Files.walk.

Lektion 3 af 413 trin

Gennemløb af mappetræer med Files.walk er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Oversigt over Files.walk

Files.walk(startPath) returnerer en doven Stream<Path>, der rekursivt viser alle filer og mapper fra den angivne sti. Gennemløbet sker i dybden først og inkluderer selve startstien.

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

Begrænsning af dybden

Angiv en maksimal dybde for at forhindre for dyb rekursion:

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

Filtrering efter filtype

Kombinér med Files.isRegularFile() eller Files.isDirectory() for at filtrere:

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

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

Filtrering efter filendelse

Find alle filer med en bestemt filendelse:

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

Beregning af mappestørrelse

Summér størrelsen på alle filer under en mappe:

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 sammenlignet med Files.walk

Files.list(dir) viser kun det umiddelbare indhold i én mappe (ligesom ls). Files.walk gennemløber også undermapper.

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

Files.find til attributbaseret søgning

Files.find(root, depth, matcher) er mere effektiv end walk+filter, når søgningen baseres på filattributter:

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

Sletning af et mappetræ

Brug walk + sorted(reversed) til at slette en mappe og alt dens indhold (de dybeste filer først):

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

Kopiering af et mappetræ

Gennemløb kildetræet, og kopiér hver fil, mens mappestrukturen bevares:

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

Håndtering af utilgængelige filer

Files.walk kaster IOException, hvis den møder en mappe, som den ikke kan læse. Brug FileVisitOption.FOLLOW_LINKS med omtanke — cyklusser i symbolske links kan medføre uendelig 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: Hændelsesbaseret gennemløb

Brug Files.walkFileTree() sammen med en FileVisitor for mere detaljeret kontrol (før-besøg, efter-besøg og fejlhåndtering):

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

Hurtig kontrol

Hvilken Files-metode skal du bruge til KUN at vise en mappes umiddelbare underordnede (uden rekursion)?

Opsummering: Files.walk

Vigtige pointer:

  • Files.walk(root) — doven, rekursiv Stream med alle stier
  • Brug altid try-with-resources til at lukke strømmen
  • Filtrér med Files.isRegularFile/isDirectory; filtrér efter filendelse med endsWith
  • Files.list(dir) — kun umiddelbare underordnede
  • Files.find — effektiv attributbaseret søgning
  • walkFileTree — hændelsesbaseret med tilbagekald før og efter besøg
Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “Gennemløb af mappetræer med Files.walk” gratis?

Ja — hele teksten til “Gennemløb af mappetræer med Files.walk” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Gennemløb af mappetræer med Files.walk”?

Vis filer rekursivt, filtrér efter filtypenavn, og beregn mappestørrelser med Files.walk. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Gennemløb af mappetræer med Files.walk”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Path: repræsentation af filplaceringer
  2. Files-værktøjet: læs, skriv, kopiér, flyt
  3. Gennemløb af mappetræer med Files.walk
  4. WatchService: overvågning af filændringer
← Tilbage til Java Academy