Sjekk om en fil eller katalog eksisterer i Java

1. Oversikt

I denne raske opplæringen skal vi bli kjent med forskjellige måter å sjekke eksistensen av en fil eller katalog.

Først begynner vi med de moderne NIO API-ene, og deretter dekker de eldre IO-tilnærmingene.

2. Bruke java.nio.file.Files

For å sjekke om en fil eller katalog eksisterer, kan vi bruke Files.exists (bane) metode. Som det fremgår av metodesignaturen, bør vi først skaffe oss en Sti til den tiltenkte filen eller katalogen. Så kan vi passere det Sti til Files.exists (bane) metode:

Banesti = Paths.get ("eksisterer-ikke-eksisterer.txt"); assertFalse (Files.exists (sti));

Siden filen ikke eksisterer, returnerer den falsk. Det er også verdt å nevne at hvis Files.exists (bane) metoden møter en IO Unntak, det kommer tilbake falskogså.

På den annen side, når den gitte filen eksisterer, kommer den tilbake ekte som forventet:

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

Her oppretter vi en midlertidig fil og ringer deretter til Files.exists (bane) metode.

Dette fungerer til og med for kataloger:

Sti tempDirectory = Files.createTempDirectory ("baeldung-eksisterer"); assertTrue (Files.exists (tempDirectory));

Hvis vi spesifikt vil vite om en fil eller katalog eksisterer, kan vi også bruke den Files.isDirectory (bane) eller Files.isRegularFile (bane) metoder:

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

Det er også en notExists (sti) metode som returnerer ekte hvis gitt Sti eksisterer ikke:

assertFalse (Files.notExists (tempDirectory));

Noen ganger Files.exists (bane) returnerer falsk fordi vi ikke har de nødvendige filtillatelsene. I slike scenarier kan vi bruke Files.isReadable (bane) metode for å sikre at filen faktisk er lesbar av den nåværende brukeren:

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

2.1. Symbolske lenker

Som standard er Files.exists (bane) metoden følger de symbolske koblingene. Hvis filen EN har en symbolsk lenke til filen B, og så Files.exists (A) metoden returnerer ekte hvis og bare hvis filen B eksisterer allerede:

Banemål = Files.createTempFile ("baeldung", "target"); Banesymbol = Paths.get ("test-link-" + ThreadLocalRandom.current (). NextInt ()); Sti symbolicLink = Files.createSymbolicLink (symbol, mål); assertTrue (Files.exists (symbolicLink));

Nå hvis vi sletter målet for lenken, blir Files.exists (bane) vil returnere falsk:

Files.deleteIfExists (mål); assertFalse (Files.exists (symbolicLink));

Siden koblingsmålet ikke eksisterer lenger, vil følgende link ikke føre til noe, og Files.exists (bane) vil returnere falsk.

Det er til og med mulig å ikke følge de symbolske koblingene ved å passere en passende LinkOption som det andre argumentet:

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

Fordi selve lenken eksisterer, er Files.exists (bane) metoden returnerer ekte. Vi kan også sjekke om en Sti er en symbolsk lenke ved hjelp av Files.isSymbolicLink (bane) metode:

assertTrue (Files.isSymbolicLink (symbolicLink)); assertFalse (Files.isSymbolicLink (mål));

3. Bruke java.io. fil

Hvis vi bruker Java 7 eller en nyere versjon av Java, anbefales det sterkt å bruke de moderne Java NIO API-ene for slike krav.

For å være sikker på om det finnes en fil eller katalog i Java arv IO-verden, kan vi ringe eksisterer () metode på Fil forekomster:

assertFalse (ny fil ("ugyldig"). eksisterer ());

Hvis filen eller katalogen allerede eksisterer, kommer den tilbake ekte:

Sti tempFilePath = Files.createTempFile ("baeldung", "exist-io"); Sti tempDirectoryPath = Files.createTempDirectory ("baeldung-existent-io"); Fil tempFile = ny fil (tempFilePath.toString ()); Fil tempDirectory = ny fil (tempDirectoryPath.toString ()); assertTrue (tempFile.exists ()); assertTrue (tempDirectory.exists ());

Som vist ovenfor, de eksisterer () metoden bryr seg ikke om det er en fil eller katalog. Derfor, så lenge den eksisterer, kommer den tilbake ekte.

De isFile () metoden returnerer imidlertid ekte hvis den gitte banen er en eksisterende fil:

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

Tilsvarende isDirectory () metoden returnerer ekte hvis den angitte banen er en eksisterende katalog:

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

Til slutt, kan lese() metoden returnerer ekte hvis filen er lesbar:

assertTrue (tempFile.canRead ()); assertFalse (ny fil ("/ root / .bashrc"). canRead ());

Når den kommer tilbake falsk, eksisterer filen enten ikke, eller den nåværende brukeren har ikke lesetillatelse på filen.

4. Konklusjon

I denne korte opplæringen så vi hvordan vi kan sikre at en fil eller katalog eksisterer i Java. Underveis snakket vi om moderne NIO og de eldre IO API-ene. Vi så også hvordan NIO API håndterer symbolske lenker.

Som vanlig er alle eksemplene tilgjengelige på GitHub.


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