Sjekk om en katalog er tom i Java

1. Oversikt

I denne raske opplæringen skal vi bli kjent med noen måter å finne ut om en katalog er tom eller ikke.

2. Bruke Files.newDirectoryStream

Fra og med Java 7, Files.newDirectoryStream metoden returnerer a DirectoryStream for å gjenta alle oppføringene i katalogen. Så vi kan bruke dette API-et til å sjekke om den gitte katalogen er tom eller ikke:

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

For ikke-kataloginnganger kommer vi tilbake falsk uten å prøve å laste inn katalogoppføringene:

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

På den annen side, hvis inngangen er en katalog, prøver vi å åpne en DirectoryStream til den katalogen. Så vil vi betrakte katalogen som tom hvis og bare hvis den første hasNext () metode samtale retur falsk. Ellers er den ikke tom:

Sti currentDir = ny fil (""). ToPath (). ToAbsolutePath (); assertThat (isEmpty (currentDir)). isFalse ();

De DirectoryStream er en Lukkbar ressurs, så vi pakker den inn i en prøve-med-ressurs-blokk. Som vi kanskje forventer, er er tom metoden returnerer ekte for tomme kataloger:

Banesti = Files.createTempDirectory ("baeldung-tom"); assertThat (isEmpty (path)). isTrue ();

Her bruker vi Files.createTempDirectory for å opprette en tom og midlertidig katalog.

3. Bruke Files.list

Fra og med JDK 8 ble Files.list metoden bruker Files.newDirectoryStream API internt for å avsløre en Strøm. Hver Sti er en oppføring i den gitte foreldrekatalogen. Derfor kan vi også bruke denne APIen for samme formål:

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

Igjen berører vi bare den første oppføringen ved hjelp av findFirst metode. Hvis den returnerte Valgfri er tom, så er også katalogen tom.

De Strøm støttes av en I / O-ressurs, så vi sørger for å frigjøre den på riktig måte ved hjelp av en prøve-med-ressurs-blokk.

4. Ineffektive løsninger

Både Files.list og Files.newDirectoryStream vil itere katalogoppføringene lat. Derfor vil de jobbe med store kataloger veldig effektivt. Imidlertid vil slike løsninger ikke fungere bra i dette scenariet:

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

Dette vil ivrig laste opp alle oppføringene i katalogen, noe som vil være ganske ineffektivt når du arbeider med store kataloger.

5. Konklusjon

I denne korte opplæringen ble vi kjent med noen effektive måter å sjekke om en katalog er tom eller ikke.

Som vanlig er alle eksemplene tilgjengelige på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found