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 (´ ・ ω ・
)