Ich muss eine Liste aller Dateien in einem Verzeichnis erhalten, einschließlich der Dateien in allen Unterverzeichnissen. Was ist der Standardweg, um eine Verzeichnisiteration mit Java durchzuführen?
175
Sie können File#isDirectory()
damit testen, ob die angegebene Datei (Pfad) ein Verzeichnis ist. Wenn dies der Fall ist true
, rufen Sie dieselbe Methode mit ihrem File#listFiles()
Ergebnis erneut auf. Dies wird als Rekursion bezeichnet .
Hier ist ein grundlegendes Kickoff-Beispiel.
public static void main(String... args) {
File[] files = new File("C:/").listFiles();
showFiles(files);
}
public static void showFiles(File[] files) {
for (File file : files) {
if (file.isDirectory()) {
System.out.println("Directory: " + file.getName());
showFiles(file.listFiles()); // Calls same method again.
} else {
System.out.println("File: " + file.getName());
}
}
}
Beachten Sie, dass dies empfindlich ist, StackOverflowError
wenn der Baum tiefer ist, als der Stapel der JVM aufnehmen kann. Vielleicht möchten Sie stattdessen einen iterativen Ansatz oder eine Schwanzrekursion verwenden, aber das ist ein anderes Thema;)
NullPointerException
in dem sich das Dateisystem zwischen dem Aufruf vonisDirectory
und dem Blockieren ändert oder Sie einfach Pech haben. Wenn Sie überprüfen, ob die Ausgabe von nicht null ist, wird diese Racebedingung gelöst.listFiles
System.out.println
listFiles
java.nio.file.DirectoryStream
können Sie über ein Verzeichnis iterieren und könnten so implementiert werden, dass sie einen geringen Speicherbedarf haben, aber der einzige Weg, dies sicher zu sagen, wäre um die Speichernutzung auf einer bestimmten Plattform zu überwachen.Wenn Sie Java 1.7 verwenden, können Sie verwenden
java.nio.file.Files.walkFileTree(...)
.Beispielsweise:
Wenn Sie Java 8 verwenden, können Sie die Stream-Schnittstelle verwenden mit
java.nio.file.Files.walk(...)
:quelle
Schauen Sie sich die FileUtils- Klasse in Apache Commons an - speziell iterateFiles :
quelle
Für Java 7+ gibt es auch https://docs.oracle.com/javase/7/docs/api/java/nio/file/DirectoryStream.html
Beispiel aus dem Javadoc:
quelle
Verwenden von
org.apache.commons.io.FileUtils
Verwenden Sie false, wenn Sie keine Dateien aus Unterverzeichnissen möchten.
quelle
Es ist ein Baum, also ist Rekursion Ihr Freund: Beginnen Sie mit dem übergeordneten Verzeichnis und rufen Sie die Methode auf, um ein Array von untergeordneten Dateien abzurufen. Durchlaufen Sie das untergeordnete Array. Wenn der aktuelle Wert ein Verzeichnis ist, übergeben Sie ihn an einen rekursiven Aufruf Ihrer Methode. Wenn nicht, verarbeiten Sie die Blattdatei entsprechend.
quelle
Wie bereits erwähnt, ist dies ein Rekursionsproblem. Insbesondere möchten Sie vielleicht einen Blick darauf werfen
In der Java-Datei-API hier . Es gibt ein Array aller Dateien in einem Verzeichnis zurück. Verwenden Sie dies zusammen mit
zu sehen, ob Sie weiter zurückgreifen müssen, ist ein guter Anfang.
quelle
Um mit @msandiford Antwort hinzuzufügen, möchten Sie in den meisten Fällen, wenn ein Dateibaum durchlaufen wird, eine Funktion als Verzeichnis ausführen oder eine bestimmte Datei wird besucht. Wenn Sie keine Streams verwenden möchten. Die folgenden überschriebenen Methoden können implementiert werden
quelle
Sie können File.list (FilenameFilter) (und Varianten) auch zum Durchlaufen von Dateien missbrauchen. Funktionscode und funktioniert in frühen Java-Versionen, zB:
quelle