Wie lässt sich der gesamte Inhalt eines Verzeichnisses einschließlich seiner Unterverzeichnisse durchsuchen?

Ein Verfahren namens Rekursion erlaubt es, auf elegante Art und Weise beliebig tiefe Dateibäume zu durchwandern.

Die Beispielklasse enthält zwei Methoden. In main() wird zunächst der String des zu durchsuchenden Verzeichnisses deklariert und mit diesem ein File -Objekt gebildet. Danach liefert die zweite Methode getPaths() eine ArrayList , die dann durchlaufen und deren Inhalt ausgegeben wird.
Die Methode getPaths() durchläuft das als ersten Parameter übergebene Verzeichnis und speichert die absoluten Pfade der dort gefundenen Dateien und Verzeichnisse als File -Objekte in der als zweitem Parameter übergebenen, zunächst leeren ArrayList .

Dies geschieht folgendermaßen: Als erstes wird geprüft, ob das übergebene File -Objekt auch wirklich ein Verzeichnis ist. Ist das nicht der Fall oder ist einer der Parameter null, so bricht die Methode ab und gibt null zurück. Der Inhalt des Verzeichnisse wird dann durch die Methode listFiles() in ein File -Array eingelesen. Dies wird in einer for-Schleife durchlaufen und dort jedes Element darauf hin überprüft, ob es sich um ein Verzeichnis handelt.
Hier wird nun das Verfahren der Rekursion angewendet: Bezeichnet das gefundene File -Objekt ein Verzeichnis, so ruft sich getPaths() selbst auf, indem es das neu gefundene Verzeichnis als neuen ersten Parameter übergibt. So steigt die Durchsuchung in dieses Verzeichnis ab und fährt erst nach Abschluss von dessen Durchsuchung an der bisherigen Stelle fort. Dies kann beliebig oft und tief erfolgen.
Wenn das gefundene File -Objekt kein Verzeichnis und somit eine Datei ist, so wird deren Pfad zur ArrayList hinzugefügt. Sie wird dann nach Abschluss des Auslesens von der Methode zurück gegeben.

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

public class VerzeichnisDurchsuchen {

    public static void main(String[] args) {
        String verzName = "/Users/joecze/Desktop/test/";
        ArrayList<File> files = getPaths(new File(verzName),
                new ArrayList<File>());
        if(files == null) return;
        try {
            for (int i = 0; i < files.size(); i++)
                System.out.println(files.get(i).getCanonicalPath());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static ArrayList<File> getPaths(File file, ArrayList<File> list) {
        if (file == null || list == null || !file.isDirectory())
            return null;
        File[] fileArr = file.listFiles();
        for (File f : fileArr) {
            if (f.isDirectory()) {
                getPaths(f, list);
            }
            list.add(f);
        }
        return list;
    }
}