[Java] Verarbeitet alle Dateien in einem bestimmten Verzeichnis

Es ist nichts Neues, aber ich werde es irgendwie posten.

Die in Java7 hinzugefügten Dateien # walkFileTree () scheinen für die Verarbeitung wie das Thema gut zu sein.

WalkFileTreeSample.java


import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.io.*;
 
public class WalkFileTreeSample {
    public static void main(String[] args) throws IOException {
        Path start = Paths.get("/Users/daiki/go");
 
        Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                    System.out.println(file);
                    return FileVisitResult.CONTINUE;
                }
            });
    }
}

SimpleFileVisitor ist eine gewöhnliche Klasse, keine funktionale Schnittstelle, daher können Sie keine Lambda-Ausdrücke verwenden. Oben wird nur die für jede Datei aufgerufene Methode überschrieben, es gibt jedoch auch andere Methoden, die vor dem Besuch des Verzeichnisses aufgerufen werden, nach der aufgerufene Methoden usw., und die Verarbeitung kann durch Überschreiben eingefügt werden.

Als weiteres Beispiel können Sie die in Java 8 hinzugefügten Dateien # walk () verwenden. Dies verwendet die Stream-API. Das Verzeichnis wird ausgeschlossen, um das Ergebnis mit dem oben genannten abzugleichen. Ist es ein bisschen unangenehm?

WalkSample.java


import java.io.IOException;
import java.nio.file.*;
import java.util.stream.Stream;

public class WalkSample {
    public static void main(String[] args) throws IOException {
        Path start = Paths.get("/path/to/target");
        try(Stream<Path> paths = Files.walk(start)) {
            paths.filter(path -> !Files.isDirectory(path))
                .forEach(System.out::println);
        }
    }
}

Wenn es Java6 oder früher ist, müssten Sie es selbst mit Wiederholung schreiben? Wenn Sie nur den Dateinamen ausgeben möchten, gibt es nichts besonders Schwieriges.

WalkWithoutLibrarySample.java


import java.io.File;

public class WalkWithoutLibrarySample {
    public static void main(String[] args) {
        File start = new File("/path/to/target");
        walk(start);
    }

    private static void walk(File dir) {
        for(File file : dir.listFiles()) {
            if(file.isFile()) {
                System.out.println(file);
            } else {
                walk(file);
            }
        }
    }
}

Referenz

Recommended Posts

[Java] Verarbeitet alle Dateien in einem bestimmten Verzeichnis
Verwenden Sie java1.7 (zulu7) in einem bestimmten Verzeichnis mit jenv
Ich möchte rekursiv nach Dateien in einem bestimmten Verzeichnis suchen
[Java-Tool] Ein Tool, das Dateien unter dem angegebenen Pfad nach Erweiterung löscht
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
Erstellung eines Java-Verzeichnisses