[Java] Traite tous les fichiers dans un certain répertoire

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

référence

Recommended Posts

[Java] Traite tous les fichiers dans un certain répertoire
Utilisez java1.7 (zulu7) dans un répertoire spécifique avec jenv
Je souhaite rechercher de manière récursive des fichiers dans un répertoire spécifique
[outil java] Un outil qui supprime les fichiers sous le chemin spécifié par extension
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
création de répertoire java