Kontroller, om et bibliotek er tomt i Java

1. Oversigt

I denne hurtige vejledning bliver vi fortrolige med et par måder at finde ud af, om en mappe er tom eller ej.

2. Brug Files.newDirectoryStream

Fra og med Java 7 er Files.newDirectoryStream metode returnerer a DirectoryStream for at gentage alle poster i telefonbogen. Så vi kan bruge denne API til at kontrollere, om den givne mappe er tom eller ej:

public boolean isEmpty (sti sti) kaster IOException {hvis (Files.isDirectory (sti)) {prøv (DirectoryStream mappe = Files.newDirectoryStream (sti)) {returner! directory.iterator (). hasNext (); }} returner falsk; }

For input, der ikke er bibliotek, vender vi tilbage falsk uden selv at prøve at indlæse biblioteksposter:

Sti aFile = Paths.get (getClass (). GetResource ("/ notDir.txt"). ToURI ()); hævder, at (isEmpty (aFile)). er Falsk ();

På den anden side, hvis input er en mappe, vil vi prøve at åbne en DirectoryStream til den mappe. Så betragter vi biblioteket som tomt, hvis og kun hvis det første hasNext () metode opkaldsretur falsk. Ellers er den ikke tom:

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

Det DirectoryStream er en Kan lukkes ressource, så vi pakker den ind i en prøve-med-ressource-blok. Som vi kunne forvente, er tom metoden vender tilbage rigtigt til tomme mapper:

Sti sti = Files.createTempDirectory ("baeldung-tom"); assertThat (isEmpty (sti)). isTrue ();

Her bruger vi Files.createTempDirectory for at oprette en tom og midlertidig mappe.

3. Brug Files.list

Fra og med JDK 8 blev Files.list metoden bruger Files.newDirectoryStream API internt for at udsætte en Strøm. Hver Sti er en post i det givne overordnede bibliotek. Derfor kan vi også bruge denne API til samme formål:

public boolean isEmpty (sti sti) kaster IOException {hvis (Files.isDirectory (sti)) {prøv (Stream poster = Files.list (sti)) {return! entries.findFirst (). isPresent (); }} returner falsk; }

Igen rører vi kun ved den første post ved hjælp af findFirst metode. Hvis den returneres Valgfri er tom, så er biblioteket også tom.

Det Strøm er bakket op af en I / O-ressource, så vi sørger for at frigive den korrekt ved hjælp af en prøve-med-ressource-blok.

4. Ineffektive løsninger

Begge Files.list og Files.newDirectoryStream vil gentage mappeposterne doven. Derfor vil de arbejde med store kataloger meget effektivt. Imidlertid fungerer løsninger som dette ikke godt i dette scenarie:

offentlig boolsk isEmpty (sti) {return path.toFile (). listFiles (). længde == 0; }

Dette vil ivrigt indlæse alle poster i biblioteket, hvilket vil være ret ineffektivt, når du beskæftiger dig med store mapper.

5. Konklusion

I denne korte vejledning blev vi fortrolige med et par effektive måder at kontrollere, om en mappe er tom eller ej.

Som sædvanligt er alle eksemplerne tilgængelige på GitHub.