[JAVA] Ich möchte rekursiv nach Dateien in einem bestimmten Verzeichnis suchen

Ich musste kürzlich rekursiv nach Dateien in einem Verzeichnis suchen. Ich denke, dass Javas Standard-API eine solche Funktion hat, aber es ist nicht überraschend.

__2016-12-29 Nachtrag ___: Obwohl geschrieben steht, dass "es nicht im Standard ist", wurde darauf hingewiesen, dass es tatsächlich verschiedene Dinge gibt. Weitere Informationen finden Sie im Kommentarbereich.

Angenommen, Sie haben ein Verzeichnis mit der folgenden Struktur:

D:\>tree D:\temp /f
Liste der Ordnerpfade:Volumendaten
Die Seriennummer des Volumes lautet C4C7-10BC
D:\TEMP
│ Text 0.txt
│
├─ Ordner 1
│ │ Text 1.txt
│  │
│ └ Ordner 1-1
│ Text 1-1.txt
│
├─ Ordner 2
│ Text 1.txt
│
└─ Ordner 3
Text 3.txt

So rekursiv nach Dateien unter diesem D: \ temp suchen:

package folder;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class FolderUtils {

	public static void main(String[] args) {
		
		String absolutePath = "D:\\temp";
		List<File> files = FolderUtils.findAllFile(absolutePath);
		for (File file : files) System.out.println(file.getAbsolutePath());
			// D:\temp\Ordner 2\Text 1.txt
			// D:\temp\Ordner 1\Ordner 1-1\Text 1-1.txt
			// D:\temp\Ordner 1\Text 1.txt
			// D:\temp\Ordner 3\Text 3.txt
			// D:\temp\Text 0.txt

	}


	/**
	 *Suchen Sie rekursiv nach Dateien in einem bestimmten Verzeichnis.
	 * @param absolutePath Der absolute Pfad des Verzeichnisses.
	 * @Liste der Rückgabedateien
	 */
	public static List<File> findAllFile(String absolutePath) {

		List<File> files = new ArrayList<>();

		Stack<File> stack = new Stack<>();
		stack.add(new File(absolutePath));
		while (!stack.isEmpty()) {
			File item = stack.pop();
			if (item.isFile()) files.add(item);

			if (item.isDirectory()) {
				for (File child : item.listFiles()) stack.push(child);
			}
		}

		return files;
	}
}

Der Algorithmus ist eine Tiefenprioritätssuche. Wenn es sich um ein Verzeichnis handelt, ist es so einfach wie das Suchen darunter, andernfalls wird es aufgelistet. Ich habe mich für die Implementierung mit Stacks anstelle von rekursiven Aufrufen entschieden, die mit der Suche mit Tiefenpriorität kompatibel sind - nicht weil ich effizient implementieren wollte -, sondern weil ich nur wissen wollte, dass Java Stacks hat (ich wollte es verwenden). ´ ・ ω ・ ) Es tut mir leid, dass ich keinen großen Grund habe (´ ・ ω ・)

Recommended Posts

Ich möchte rekursiv nach Dateien in einem bestimmten Verzeichnis suchen
Ich möchte die Liste der Klassen unter dem Paket rekursiv durchsuchen
Ich möchte eine bestimmte Datei mit WatchService überwachen
Ich möchte eine generische Anmerkung für einen Typ erstellen
Ich möchte ein bestimmtes Modell von ActiveRecord ReadOnly erstellen
Ich möchte eine Webanwendung entwickeln!
Ich möchte ein schönes build.gradle schreiben
Ich möchte einen Unit Test schreiben!
Wenn Rails eine Sitzung für einen bestimmten Controller deaktivieren soll
Ich habe ein Diff-Tool für Java-Dateien erstellt
[Java] Verarbeitet alle Dateien in einem bestimmten Verzeichnis
[Ruby] Ich möchte einen Methodensprung machen!
Ich möchte eine einfache Wiederholung einer Zeichenkette schreiben
Ich möchte eine Struktur für die Ausnahmebehandlung entwerfen
Ich möchte eine von Git verwaltete Datei löschen
[Android] Ich möchte einen ViewPager erstellen, der für Tutorials verwendet werden kann
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
Ich möchte eine Methode einer anderen Klasse aufrufen
Ich habe eine Methode entwickelt, um nach Premium Friday zu fragen
Ich möchte ein kleines Symbol in Rails verwenden
Ich möchte ContainerRelativeShape nur auf bestimmte Ecken anwenden [SwiftUI]
Ich möchte eine Funktion in der Rails Console definieren
Ich möchte in RSpec auf einen GoogleMap-Pin klicken
Verwenden Sie java1.7 (zulu7) in einem bestimmten Verzeichnis mit jenv
Ich möchte der Kommentarfunktion eine Löschfunktion hinzufügen
Implementierung einer starken API für "Ich möchte ~~ auf dem Bildschirm anzeigen" mit einfachem CQRS
[Java] Ich möchte ein Byte-Array in eine Hexadezimalzahl konvertieren
Ich möchte einen relativen Pfad in einer Situation finden, in der Pfad verwendet wird
Ich möchte eine Produktinformationsbearbeitungsfunktion ~ part1 ~ implementieren
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Methode aufrufen und die Nummer zählen
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Ich möchte ein Formular erstellen, um die Kategorie [Schienen] auszuwählen
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Ich möchte Dateien, die bei der Arbeit verwendet werden, einfach sichern
Ich möchte dem select-Attribut einen Klassennamen geben
Ich möchte eine Parkettdatei auch in Ruby erstellen
Ich möchte FireBase verwenden, um eine Zeitleiste wie Twitter anzuzeigen
Ich möchte mehrere Rückgabewerte für das eingegebene Argument zurückgeben
Ich möchte Zeichen konvertieren ...
[Controller] Ich möchte den numerischen Wert einer bestimmten Spalte aus der Datenbank abrufen (mein Memo).
Ich möchte mit link_to [Hinweis] eine Schaltfläche mit einem Zeilenumbruch erstellen.
Ich möchte eine Browsing-Funktion mit Ruby on Rails hinzufügen
Ich möchte Swipeback auf einem Bildschirm verwenden, der XLPagerTabStrip verwendet
Nur daran möchte ich mich erinnern, 4 Entwürfe zum Schreiben von Unit-Tests
Die Geschichte von Collectors.groupingBy, die ich für die Nachwelt behalten möchte
Ich möchte OutOfMemory bei der Ausgabe großer Dateien mit POI vermeiden
Erstellt eine Methode zum Anfordern von Premium Friday (Java 8-Version)
[Einführung in JSP + Servlet] Ich habe eine Weile damit gespielt ♬
Ich möchte mit einem regulären Ausdruck zwischen Zeichenketten extrahieren
[Für Anfänger] Ich möchte mit einem Auswahlbefehl automatisch vorregistrierte Daten in das Eingabeformular eingeben.
[Rails] Ich habe etwas über Migrationsdateien gelernt! (Hinzufügen einer Spalte zur Tabelle)