Controleer of er een bestand of directory bestaat in Java

1. Overzicht

In deze korte tutorial maken we kennis met verschillende manieren om het bestaan ​​van een bestand of directory te controleren.

We beginnen eerst met de moderne NIO-API's en behandelen daarna de verouderde IO-benaderingen.

2. Met behulp van java.nio.file.Files

Om te controleren of een bestand of map bestaat, kunnen we de Files.exists (pad) methode. Zoals duidelijk is uit de handtekening van de methode, moeten we eerst een Pad naar het bedoelde bestand of map. Dan kunnen we dat passeren Pad naar de Files.exists (pad) methode:

Path path = Paths.get ("does-not-exist.txt"); assertFalse (Files.exists (pad));

Omdat het bestand niet bestaat, keert het terug false. Het is ook vermeldenswaard dat als het Files.exists (pad) methode ontmoet een IOException, het zal terugkeren falseook.

Aan de andere kant, als het opgegeven bestand bestaat, keert het terug waar zoals verwacht:

Pad tempFile = Files.createTempFile ("baeldung", "exist-article"); assertTrue (Files.exists (tempFile));

Hier maken we een tijdelijk bestand aan en roepen vervolgens het Files.exists (pad) methode.

Dit werkt zelfs voor mappen:

Pad tempDirectory = Files.createTempDirectory ("baeldung-exist"); assertTrue (Files.exists (tempDirectory));

Als we specifiek willen weten of een bestand of directory bestaat, kunnen we ook Files.isDirectory (pad) of Files.isRegularFile (pad) methoden:

assertTrue (Files.isDirectory (tempDirectory)); assertFalse (Files.isDirectory (tempFile)); assertTrue (Files.isRegularFile (tempFile));

Er is ook een notExists (pad) methode die terugkeert waar als de gegeven Pad bestaat niet:

assertFalse (Files.notExists (tempDirectory));

Soms het Files.exists (pad) geeft terug false omdat we niet over de vereiste bestandsrechten beschikken. In dergelijke scenario's kunnen we de Files.isReadable (pad) methode om ervoor te zorgen dat het bestand daadwerkelijk leesbaar is voor de huidige gebruiker:

assertTrue (Files.isReadable (tempFile)); assertFalse (Files.isReadable (Paths.get ("/ root / .bashrc")));

2.1. Symbolische links

Standaard is het Files.exists (pad) methode volgt de symbolische koppelingen. Als file EEN heeft een symbolische link naar het bestand B, dan de Bestanden. Bestaat (A) methode retourneert waar als en alleen als het bestand B bestaat al:

Pad target = Files.createTempFile ("baeldung", "target"); Pad-symbool = Paths.get ("test-link-" + ThreadLocalRandom.current (). NextInt ()); Pad symbolicLink = Files.createSymbolicLink (symbool, doel); assertTrue (Files.exists (symbolicLink));

Als we nu het doel van de link verwijderen, wordt de Files.exists (pad) zal terugkeren false:

Files.deleteIfExists (doel); assertFalse (Files.exists (symbolicLink));

Omdat het linkdoel niet meer bestaat, leidt het volgen van de link nergens toe, en Files.exists (pad) zal terugkeren false.

Het is zelfs mogelijk om de symbolische links niet te volgen door een passende door te geven LinkOption als het tweede argument:

assertTrue (Files.exists (symbolicLink, LinkOption.NOFOLLOW_LINKS));

Omdat de link zelf bestaat, is de Files.exists (pad) methode retourneert waar. We kunnen ook controleren of a Pad is een symbolische link die de Files.isSymbolicLink (pad) methode:

assertTrue (Files.isSymbolicLink (symbolicLink)); assertFalse (Files.isSymbolicLink (doel));

3. Met behulp van java.io.File

Als we Java 7 of een nieuwere versie van Java gebruiken, wordt het ten zeerste aanbevolen om de moderne Java NIO API's te gebruiken voor dit soort vereisten.

Om er echter zeker van te zijn dat er een bestand of directory bestaat in de oudere IO-wereld van Java, kunnen we het bestaat () methode op het dossier gevallen:

assertFalse (nieuw bestand ("ongeldig"). bestaat ());

Als het bestand of de map al bestaat, keert het terug waar:

Pad tempFilePath = Files.createTempFile ("baeldung", "exist-io"); Pad tempDirectoryPath = Files.createTempDirectory ("baeldung-exist-io"); Bestand tempFile = nieuw bestand (tempFilePath.toString ()); Bestand tempDirectory = nieuw bestand (tempDirectoryPath.toString ()); assertTrue (tempFile.exists ()); assertTrue (tempDirectory.exists ());

Zoals hierboven getoond, de bestaat () methode maakt het niet uit of het een bestand of map is. Daarom zal het, zolang het bestaat, terugkeren waar.

De isFile () methode retourneert echter waar als het opgegeven pad een bestaand bestand is:

assertTrue (tempFile.isFile ()); assertFalse (tempDirectory.isFile ());

Evenzo is het isDirectory () methode retourneert waar als het opgegeven pad een bestaande directory is:

assertTrue (tempDirectory.isDirectory ()); assertFalse (tempFile.isDirectory ());

eindelijk, de kunnen lezen() methode retourneert waar als het bestand leesbaar is:

assertTrue (tempFile.canRead ()); assertFalse (nieuw bestand ("/ root / .bashrc"). canRead ());

Als het terugkeert falsebestaat het bestand niet of heeft de huidige gebruiker niet de leesrechten voor het bestand.

4. Conclusie

In deze korte tutorial hebben we gezien hoe we ervoor kunnen zorgen dat een bestand of map in Java bestaat. Onderweg hadden we het over moderne NIO en de verouderde IO API's. We hebben ook gezien hoe de NIO API omgaat met symbolische koppelingen.

Zoals gewoonlijk zijn alle voorbeelden beschikbaar op GitHub.