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