Skontrolujte, či je adresár v Jave prázdny

1. Prehľad

V tomto rýchlom výučbe sa oboznámime s niekoľkými spôsobmi, ako zistiť, či je adresár prázdny alebo nie.

2. Pomocou Files.newDirectoryStream

Od verzie Java 7 sa Files.newDirectoryStream metóda vracia a DirectoryStream opakovať všetky položky v adresári. Pomocou tohto rozhrania API teda môžeme skontrolovať, či je daný adresár prázdny alebo nie:

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

V prípade iných ako adresárových vstupov sa vrátime nepravdivé bez toho, aby ste sa pokúsili načítať položky adresára:

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

Na druhej strane, ak je vstupom adresár, pokúsime sa otvoriť a DirectoryStream do tohto adresára. Potom budeme považovať adresár za prázdny, len ak je prvý hasNext () metóda spätného volania nepravdivé. V opačnom prípade nie je prázdny:

Cesta currentDir = nový súbor (""). ToPath (). ToAbsolutePath (); assertThat (isEmpty (currentDir)). isFalse ();

The DirectoryStream je a Uzatvárateľné zdroj, takže to zabalíme do bloku vyskúšania zdrojov. Ako by sme mohli očakávať, je prázdny metóda sa vracia pravda pre prázdne adresáre:

Cesta cesty = Files.createTempDirectory ("baeldung-empty"); assertThat (isEmpty (cesta)). isTrue ();

Tu používame Files.createTempDirectory vytvoriť prázdny a dočasný adresár.

3. Používanie Zoznam súborov

Od JDK 8 sa Zoznam súborov metóda používa Files.newDirectoryStream API interne vystaviť a Prúd. Každý Cesta je položka v danom nadradenom adresári. Preto môžeme na rovnaké účely použiť aj toto API:

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

Opäť sa dotýkame iba prvého záznamu pomocou findFirst metóda. Ak sa vrátil Voliteľné je prázdny, potom je prázdny aj adresár.

The Prúd je chránený I / O prostriedkom, takže sa ubezpečujeme, že ho vhodne uvoľníme pomocou bloku try-with-resources.

4. Neefektívne riešenia

Oboje Zoznam súborov a Files.newDirectoryStream bude lenivo iterovať položky v adresári. Preto budú pracovať s obrovskými adresármi veľmi efektívne. Takéto riešenia však nebudú dobre fungovať v tomto scenári:

public boolean isEmpty (cesta cesty) {návratová cesta.toFile (). listFiles (). dĺžka == 0; }

To bude dychtivo načítať všetky položky v adresári, čo bude dosť neefektívne pri práci s obrovskými adresármi.

5. Záver

V tomto krátkom tutoriáli sme sa oboznámili s niekoľkými efektívnymi spôsobmi, ako skontrolovať, či je adresár prázdny alebo nie.

Ako obvykle sú všetky príklady dostupné na GitHub.


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