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.