72 Stimmen

Wie überprüft man in Java, ob ein Verzeichnis leer ist

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.

100voto

Alan Punkte 2707

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();
    }
}

27voto

Divanshu Punkte 1799
Datei parentDir =  file.getParentFile();
if(parentDir.isDirectory() && parentDir.list().length == 0) {
    LOGGER.info("Verzeichnis ist leer");
} else {
    LOGGER.info("Verzeichnis ist nicht leer");
}

18voto

Minnow Punkte 416
if(!Files.list(Paths.get(directory)).findAny().isPresent()){
    Files.delete(Paths.get(directory));
 }

Da Files.list einen faul erstellten Stream zurückgibt, wird es Ihr Ausführungszeitproblem lösen.

8voto

JMelnik Punkte 6334

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.

5voto

Peng Punkte 934
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."

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X