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.