Java java.nio.file.Files newDirectoryStream()-Methode
java.nio.file.Files.newDirectoryStream()ist eine sehr praktische Methode im Java NIO (New I/O)-Paket, mit der Dateien und Unterverzeichnisse in einem Verzeichnis durchlaufen werden. Verglichen mit den traditionellenjava.io.FileMethoden, bietet es eine effizientere und flexiblere Methode zum Durchlaufen von Verzeichnissen.
Methodendefinition
public static DirectoryStream<Path> newDirectoryStream(Path dir, String glob) throws IOException
public static DirectoryStream<Path> newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter) throws IOException
Parameterbeschreibung
1. Grundlegende formale Parameter
dir(Path-Typ): Der zu öffnende Verzeichnispfad- Rückgabewert:
DirectoryStream<Path>, ein Iterationsstream aller Einträge im Verzeichnis
2. Formale Parameter mit Filter
glob(String-Typ): Ein Glob-Muster zum Abgleichen von Dateinamenfilter(DirectoryStream.Filter<? super Path>-Typ): Benutzerdefinierte Filter-Schnittstelle
Anwendungsbeispiele
1. Grundlegende Verwendung: Durchlaufen eines Verzeichnisses
Beispiel
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class DirectoryStreamExample {
public static void main(String[] args) {
Path dir = Paths.get("C:/example");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
for (Path file : stream) {
System.out.println(file.getFileName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. Filtern mit Glob-Mustern
Beispiel
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.txt")) {
for (Path file : stream) {
System.out.println(file.getFileName());
}
}
3. Verwenden eines benutzerdefinierten Filters
Beispiel
DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
@Override
public boolean accept(Path entry) throws IOException {
return Files.isDirectory(entry);
}
};
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, filter)) {
for (Path file : stream) {
System.out.println(file.getFileName());
}
}
Methodeneigenschaften
1. Effizienz
- Verwendet NIO-Kanal-Funktionen, verglichen mit traditionellen
File.listFiles()effizienter - Besonders geeignet für die Verarbeitung von Verzeichnissen mit vielen Dateien
2. Ressourcenverwaltung
- Der zurückgegebene
DirectoryStreamimplementsAutoCloseableinterface - Es wird empfohlen, die try-with-resources-Anweisung zu verwenden, um sicherzustellen, dass Ressourcen ordnungsgemäß freigegeben werden
3. Thread-Sicherheit
- Nicht thread-sicher, kann nicht über mehrere Threads hinweg gemeinsam genutzt werden
- Wenn eine nebenläufige Verarbeitung erforderlich ist, sollte für jeden Thread ein separater Stream erstellt werden
Hinweise
- IO-Ausnahmebehandlung: Muss behandelt oder das Auslösen deklariert werden
IOException - Ressourcenfreigabe: Der Stream muss geschlossen werden, um Ressourcenlecks zu vermeiden
- Leistungsüberlegungen: Bei sehr großen Verzeichnissen Stapelverarbeitung in Betracht ziehen
- Symbolische Links: Standardmäßig werden symbolische Links verfolgt, sofern nicht speziell konfiguriert
Alternativenvergleich
| Methode | Vorteile | Nachteile |
|---|---|---|
Files.newDirectoryStream() |
Effizient, unterstützt Filterung | Nicht threadsicher |
Files.list() (Java 8+) |
Gibt einen Stream zurück, unterstützt parallele Verarbeitung | Erfordert Java 8+ |
File.listFiles() |
Einfach und benutzerfreundlich | Geringere Leistung |
Best Practices
- Verwenden Sie immer die try-with-resources-Anweisung
- Verwenden Sie für komplexe Filterlogik benutzerdefinierte Filter
- Bei der Verarbeitung großer Verzeichnisse sollte die Stapelverarbeitung in Betracht gezogen werden
- In Umgebungen mit Java 8+,
Files.list()kann eine bessere Wahl sein
FAQ
F1: Wie geht man mit versteckten Dateien um?
Sie können einen benutzerdefinierten Filter verwenden:
Beispiel
F2: Wie durchläuft man Unterverzeichnisse rekursiv?
newDirectoryStream()Es ist nicht selbst rekursiv; es kann kombiniert werden mitFiles.walkFileTree()um eine rekursive Traversierung zu implementieren.
F3: Welche Vorschläge zur Leistungsoptimierung gibt es?
- Vermeiden Sie teure Operationen im Filter
- Erwägen Sie bei schreibgeschützten Operationen die Verwendung von
Files.list()und parallele Streams
Durch die ausführliche Erklärung in diesem Artikel sollten SieFiles.newDirectoryStream()die Kernverwendung und Best Practices der Methode. Diese Methode ist ein sehr praktisches Werkzeug bei Java-Dateioperationen, und richtige Verwendung kann die Effizienz der Verzeichnisdurchquerung erheblich verbessern.
Java java.nio.file.Files