Vérifier si un répertoire est vide en Java

1. Vue d'ensemble

Dans ce rapide tutoriel, nous allons nous familiariser avec quelques façons de savoir si un répertoire est vide ou non.

2. Utilisation de Files.newDirectoryStream

À partir de Java 7, la méthode Files.newDirectoryStream renvoie un DirectoryStream pour itérer sur toutes les entrées du répertoire . Nous pouvons donc utiliser cette API pour vérifier si le répertoire donné est vide ou non:

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

Pour les entrées non-répertoire, nous retournerons false sans même essayer de charger les entrées du répertoire:

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

D'un autre côté, si l'entrée est un répertoire, nous essaierons d'ouvrir un DirectoryStream dans ce répertoire. Ensuite, nous considérerons le répertoire comme vide si et seulement si le premier appel de la méthode hasNext () retourne false . Sinon, ce n'est pas vide:

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

Le DirectoryStream est une ressource fermable , nous l'enveloppons donc dans un bloc try-with-resources. Comme on pouvait s'y attendre, la méthode isEmpty renvoie true pour les répertoires vides:

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

Ici, nous utilisons le Files.createTempDirectory pour créer un répertoire vide et temporaire.

3. Utilisation de Files.list

À partir de JDK 8, la méthode Files.list utilise l' API Files.newDirectoryStream en interne pour exposer un Stream . Chaque chemin est une entrée dans le répertoire parent donné. Par conséquent, nous pouvons également utiliser cette API dans le même but:

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

Encore une fois, nous touchons uniquement la première entrée en utilisant la méthode findFirst . Si l' option facultative renvoyée est vide, le répertoire est également vide.

Le Stream est soutenu par une ressource d'E / S, nous nous assurons donc de le libérer de manière appropriée en utilisant un bloc try-with-resources.

4. Solutions inefficaces

Les deux files.list et Files.newDirectoryStream itérera les entrées du répertoire paresseusement. Par conséquent, ils travailleront très efficacement avec d'énormes répertoires . Cependant, des solutions comme celle-ci ne fonctionneront pas correctement dans ce scénario:

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

Cela chargera avec empressement toutes les entrées du répertoire, ce qui sera assez inefficace lorsqu'il s'agit de répertoires énormes.

5. Conclusion

Dans ce court didacticiel, nous nous sommes familiarisés avec quelques moyens efficaces pour vérifier si un répertoire est vide ou non.

Comme d'habitude, tous les exemples sont disponibles sur over sur GitHub.