Provjerite je li direktorij prazan na Javi

1. Pregled

U ovom brzom vodiču upoznat ćemo se s nekoliko načina kako saznati je li direktorij prazan ili nije.

2. Korištenje Files.newDirectoryStream

Od Jave 7, Files.newDirectoryStream metoda vraća a DirectoryStream za ponavljanje svih unosa u direktoriju. Dakle, pomoću ovog API-ja možemo provjeriti je li zadani direktorij prazan ili nije:

javni boolean isEmpty (Put puta) baca IOException {if (Files.isDirectory (path)) {try (DirectoryStream directory = Files.newDirectoryStream (path)) {return! directory.iterator (). hasNext (); }} return false; }

Za unose koji nisu iz direktorija vratit ćemo se lažno čak i bez pokušaja učitavanja unosa u direktorij:

Put aFile = Paths.get (getClass (). GetResource ("/ notDir.txt"). ToURI ()); assertThat (isEmpty (aFile)). isFalse ();

S druge strane, ako je ulaz direktorij, pokušat ćemo otvoriti DirectoryStream u taj direktorij. Tada ćemo direktorij smatrati praznim ako i samo ako je prvi hasNext () povratak poziva metode lažno. Inače, nije prazan:

Path currentDir = nova datoteka (""). ToPath (). ToAbsolutePath (); assertThat (isEmpty (currentDir)). isFalse ();

The DirectoryStream je Može se zatvoriti resursa, pa ga umotavamo u blok try-with-resources. Kao što bismo mogli očekivati, prazno je metoda se vraća pravi za prazne imenike:

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

Ovdje koristimo Files.createTempDirectory stvoriti prazan i privremeni direktorij.

3. Korištenje Datoteke.list

Od JDK 8, Datoteke.list metoda koristi Files.newDirectoryStream API interno za izlaganje a Stream. Svaki Staza je unos unutar datog nadređenog direktorija. Stoga ovaj API možemo koristiti i u istu svrhu:

javni boolean isEmpty (Put puta) baca IOException {if (Files.isDirectory (path)) {try (Stream entries = Files.list (path)) {return! entries.findFirst (). isPresent (); }} return false; }

Opet dodirujemo samo prvi unos pomoću findFirst metoda. Ako se vratio Neobvezno je prazno, onda je i direktorij prazan.

The Stream poduprt je I / O resursom, pa ga osiguravamo na odgovarajući način pomoću bloka try-with-resources.

4. Neučinkovita rješenja

Oba Datoteke.list i Files.newDirectoryStream lijeno će ponoviti unose u direktorij. Stoga će vrlo učinkovito raditi s ogromnim direktorijima. Međutim, ovakva rješenja neće dobro funkcionirati u ovom scenariju:

javna logička vrijednost isEmpty (Put puta) {return path.toFile (). listFiles (). length == 0; }

To će željno učitati sve unose unutar direktorija, što će biti prilično neučinkovito kada se radi s ogromnim direktorijima.

5. Zaključak

U ovom kratkom vodiču upoznali smo se s nekoliko učinkovitih načina provjere je li direktorij prazan ili nije.

Kao i obično, svi su primjeri dostupni na GitHubu.