Controlla se una directory è vuota in Java

1. Panoramica

In questo breve tutorial, familiarizzeremo con alcuni modi per scoprire se una directory è vuota o meno.

2. Utilizzo di Files.newDirectoryStream

A partire da Java 7, il metodo Files.newDirectoryStream restituisce un DirectoryStream per iterare su tutte le voci nella directory . Quindi possiamo usare questa API per verificare se la directory data è vuota o meno:

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

Per gli input non di directory, restituiremo false senza nemmeno provare a caricare le voci di directory:

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

D'altra parte, se l'input è una directory, proveremo ad aprire un DirectoryStream in quella directory. Quindi considereremo la directory vuota se e solo se la prima chiamata al metodo hasNext () restituisce false . Altrimenti, non è vuoto:

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

Il DirectoryStream è un Closeable risorsa, quindi stiamo avvolgendolo all'interno di un blocco try-with-risorse. Come ci si potrebbe aspettare, il metodo isEmpty restituisce true per directory vuote:

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

Qui stiamo usando Files.createTempDirectory per creare una directory vuota e temporanea.

3. Utilizzo di Files.list

A partire da JDK 8, il metodo Files.list utilizza internamente l' API Files.newDirectoryStream per esporre un flusso . Ogni percorso è una voce all'interno della directory principale specificata. Pertanto, possiamo anche utilizzare questa API per lo stesso scopo:

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

Ancora una volta, stiamo toccando solo la prima voce utilizzando il metodo findFirst . Se l' Operativo restituito è vuoto, anche la directory è vuota.

Il flusso è supportato da una risorsa I / O, quindi ci assicuriamo di rilasciarlo in modo appropriato utilizzando un blocco di prova con risorse.

4. Soluzioni inefficienti

Sia Files.list che Files.newDirectoryStream itereranno pigramente le voci della directory. Pertanto, lavoreranno con enormi directory in modo molto efficiente . Tuttavia, soluzioni come questa non funzioneranno bene in questo scenario:

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

Questo caricherà avidamente tutte le voci all'interno della directory che sarà piuttosto inefficiente quando si tratta di directory enormi.

5. conclusione

In questo breve tutorial, abbiamo acquisito familiarità con alcuni modi efficaci per verificare se una directory è vuota o meno.

Come al solito, tutti gli esempi sono disponibili su GitHub.