Ce n'est rien de nouveau, mais je vais le poster d'une manière ou d'une autre.
Les fichiers # walkFileTree () ajoutés dans Java7 semblent être bons pour le traitement comme le sujet.
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 est une classe ordinaire, pas une interface fonctionnelle, vous ne pouvez donc pas utiliser d'expressions lambda. Dans ce qui précède, seule la méthode appelée pour chaque fichier est remplacée, mais il existe d'autres méthodes appelées avant de visiter le répertoire, des méthodes appelées après, etc., et le traitement peut être inséré par substitution.
Comme autre exemple, vous pouvez utiliser Files # walk () ajouté dans Java 8. Cela utilise l'API Stream. Le répertoire est exclu pour correspondre au résultat avec ce qui précède. Est-ce un peu inconfortable?
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);
}
}
}
Si c'est Java6 ou une version antérieure, devriez-vous l'écrire vous-même en utilisant la récurrence? Si vous souhaitez simplement afficher le nom du fichier, il n'y a rien de particulièrement difficile.
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