Controleer of een map leeg is in Java

1. Overzicht

In deze korte tutorial gaan we vertrouwd raken met een paar manieren om erachter te komen of een map leeg is of niet.

2. Met behulp van Files.newDirectoryStream

Vanaf Java 7 is het Files.newDirectoryStream methode retourneert een DirectoryStream om alle vermeldingen in de directory te herhalen. We kunnen deze API dus gebruiken om te controleren of de opgegeven map leeg is of niet:

openbare boolean isEmpty (padpad) genereert IOException {if (Files.isDirectory (pad)) {probeer (DirectoryStream directory = Files.newDirectoryStream (pad)) {return! directory.iterator (). hasNext (); }} return false; }

Voor niet-directory-invoer zullen we terugkeren false zonder zelfs maar te proberen de telefoonboekvermeldingen te laden:

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

Aan de andere kant, als de invoer een map is, zullen we proberen een DirectoryStream naar die map. Vervolgens beschouwen we de map als leeg als en slechts als de eerste hasNext () methode oproep terugkeer false. Anders is het niet leeg:

Pad currentDir = nieuw bestand (""). ToPath (). ToAbsolutePath (); assertThat (isEmpty (currentDir)). isFalse ();

De DirectoryStream is een Afsluitbaar resource, dus we verpakken het in een try-with-resources-blok. Zoals we zouden verwachten, is de is leeg methode retourneert waar voor lege mappen:

Padpad = Files.createTempDirectory ("baeldung-empty"); assertThat (isEmpty (pad)). isTrue ();

Hier gebruiken we de Files.createTempDirectory om een ‚Äč‚Äčlege en tijdelijke map te maken.

3. Met behulp van Files.list

Vanaf JDK 8 is de Files.list methode maakt gebruik van de Files.newDirectoryStream API intern om een Stroom. Elk Pad is een item in de opgegeven bovenliggende directory. Daarom kunnen we deze API ook voor hetzelfde doel gebruiken:

openbare boolean isEmpty (padpad) genereert IOException {if (Files.isDirectory (pad)) {probeer (Streamingangen = Files.list (pad)) {retour! entries.findFirst (). isPresent (); }} return false; }

Nogmaals, we raken alleen het eerste item aan met de findFirst methode. Als het geretourneerd Optioneel leeg is, dan is de directory ook leeg.

De Stroom wordt ondersteund door een I / O-resource, dus we zorgen ervoor dat deze op de juiste manier wordt vrijgegeven met behulp van een try-with-resources-blok.

4. Inefficiënte oplossingen

Beide Files.list en Files.newDirectoryStream zal de directory-ingangen lui herhalen. Daarom zullen ze zeer efficiënt met enorme mappen werken. Dit soort oplossingen werken echter niet goed in dit scenario:

openbare boolean isEmpty (Padpad) {retourpad.toFile (). listFiles (). length == 0; }

Dit zal gretig alle vermeldingen in de map laden, wat behoorlijk inefficiënt zal zijn bij het omgaan met enorme mappen.

5. Conclusie

In deze korte tutorial hebben we enkele efficiënte manieren leren kennen om te controleren of een directory leeg is of niet.

Zoals gewoonlijk zijn alle voorbeelden beschikbaar op GitHub.