Überprüfen Sie, ob ein Verzeichnis in Java leer ist

1. Übersicht

In diesem kurzen Tutorial lernen wir einige Möglichkeiten kennen, um herauszufinden, ob ein Verzeichnis leer ist oder nicht.

2. Verwenden von Files.newDirectoryStream

Ab Java 7 gibt die Files.newDirectoryStream- Methode einen DirectoryStream zurück , um alle Einträge im Verzeichnis zu durchlaufen . Mit dieser API können wir also überprüfen, ob das angegebene Verzeichnis leer ist oder nicht:

public boolean isEmpty(Path path) throws IOException { if (Files.isDirectory(path)) { try (DirectoryStream directory = Files.newDirectoryStream(path)) { return !directory.iterator().hasNext(); } } return false; }

Bei Eingaben außerhalb des Verzeichnisses geben wir false zurück, ohne die Verzeichniseinträge zu laden:

Path aFile = Paths.get(getClass().getResource("/notDir.txt").toURI()); assertThat(isEmpty(aFile)).isFalse();

Wenn es sich bei der Eingabe hingegen um ein Verzeichnis handelt, versuchen wir, einen DirectoryStream für dieses Verzeichnis zu öffnen . Dann betrachten wir das Verzeichnis genau dann als leer, wenn der erste Aufruf der Methode hasNext () false zurückgibt . Ansonsten ist es nicht leer:

Path currentDir = new File("").toPath().toAbsolutePath(); assertThat(isEmpty(currentDir)).isFalse();

Der DirectoryStream ist eine schließbare Ressource, daher verpacken wir ihn in einen Try-with-Resources-Block. Wie zu erwarten, gibt die isEmpty- Methode für leere Verzeichnisse true zurück :

Path path = Files.createTempDirectory("baeldung-empty"); assertThat(isEmpty(path)).isTrue();

Hier verwenden wir das Files.createTempDirectory , um ein leeres und temporäres Verzeichnis zu erstellen.

3. Verwenden von Files.list

Ab JDK 8 verwendet die Files.list- Methode die Files.newDirectoryStream- API intern, um einen Stream verfügbar zu machen . Jeder Pfad ist ein Eintrag im angegebenen übergeordneten Verzeichnis. Daher können wir diese API auch für denselben Zweck verwenden:

public boolean isEmpty(Path path) throws IOException { if (Files.isDirectory(path)) { try (Stream entries = Files.list(path)) { return !entries.findFirst().isPresent(); } } return false; }

Auch hier berühren wir nur den ersten Eintrag mit der findFirst- Methode. Wenn die zurückgegebene Option leer ist, ist auch das Verzeichnis leer.

Der Stream wird von einer E / A-Ressource unterstützt, daher stellen wir sicher, dass er mithilfe eines Try-with-Resources-Blocks ordnungsgemäß freigegeben wird.

4. Ineffiziente Lösungen

Sowohl Files.list als auch Files.newDirectoryStream durchlaufen die Verzeichniseinträge träge. Daher werden sie sehr effizient mit riesigen Verzeichnissen arbeiten . Lösungen wie diese funktionieren in diesem Szenario jedoch nicht gut:

public boolean isEmpty(Path path) { return path.toFile().listFiles().length == 0; }

Dadurch werden alle Einträge im Verzeichnis eifrig geladen, was beim Umgang mit großen Verzeichnissen ziemlich ineffizient ist.

5. Schlussfolgerung

In diesem kurzen Tutorial haben wir einige effiziente Methoden kennengelernt, um zu überprüfen, ob ein Verzeichnis leer ist oder nicht.

Wie üblich sind alle Beispiele auf GitHub verfügbar.