Ich möchte überprüfen, ob ein Verzeichnis in Java leer ist. Es besteht jedoch die Möglichkeit, dass sich viele Dateien in diesem Verzeichnis befinden, daher möchte ich es, wenn möglich, ohne Abfrage seiner Dateiliste tun.
Antworten
Zu viele Anzeigen?Mit JDK7 können Sie Files.newDirectoryStream verwenden, um das Verzeichnis zu öffnen, und dann die hasNext()-Methode des Iterators verwenden, um zu testen, ob Dateien vorhanden sind, über die der Iterator läuft (vergessen Sie nicht, den Stream zu schließen). Dies sollte besser für große Verzeichnisse oder wenn das Verzeichnis auf einem entfernten Dateisystem liegt, im Vergleich zu den Java.io.File-Listenmethoden funktionieren.
Beispiel:
private static boolean isDirEmpty(final Path directory) throws IOException {
try(DirectoryStream dirStream = Files.newDirectoryStream(directory)) {
return !dirStream.iterator().hasNext();
}
}
Bezogen auf den java.io.File
Quellcode wird die Methode list()
wie folgt ausgeführt:
public java.lang.String[] list() {
...
byte[][] implList = listImpl(bs);
if (implList == null) {
// leere Liste
return new String[0];
}
...
}
private synchronized static native byte[][] listImpl(byte[] path);
Sie ruft eine native Methode auf, die ein Byte-Array übergibt, um Dateien daraus zu erhalten. Wenn eine Methode null
zurückgibt, bedeutet dies, dass das Verzeichnis leer ist.
Das bedeutet, es gibt nicht einmal eine native Methode, um zu überprüfen, ob ein Verzeichnis ohne Auflisten von Dateien leer ist. Daher gibt es keinen Weg, wie sie eine Implementierung in Java haben könnten, um zu überprüfen, ob ein Verzeichnis leer ist.
Ergebnis: Die Überprüfung, ob ein Verzeichnis leer ist, ohne Dateien aufzulisten, ist in Java noch nicht implementiert.
boolean isEmptyDirectory(Path dir) throws IOException {
try (var entries = Files.list(dir)) {
return entries.count() == 0;
}
}
Ähnlich wie die Lösung von @Minnow (aber mit weniger Methodenaufrufen) hat diese Lösung den Vorteil "da Files.list einen träge befüllten Stream zurück gibt, wird es Ihr Ausführungszeitproblem lösen."
- See previous answers
- Weitere Antworten anzeigen