Kontroller, om der findes en fil eller et bibliotek i Java

1. Oversigt

I denne hurtige vejledning bliver vi fortrolige med forskellige måder at kontrollere eksistensen af ​​en fil eller mappe på.

Først starter vi med de moderne NIO API'er og dækker derefter de ældre IO-tilgange.

2. Brug java.nio.file.Files

For at kontrollere, om der findes en fil eller et bibliotek, kan vi udnytte Files.exists (sti) metode. Som det fremgår af metodesignaturen, skal vi først få en Sti til den tilsigtede fil eller mappe. Så kan vi videregive det Sti til Files.exists (sti) metode:

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

Da filen ikke findes, vender den tilbage falsk. Det er også værd at nævne, at hvis Files.exists (sti) metode møder en IOUndtagelse, det vender tilbage falsk, også.

På den anden side, når den givne fil findes, vender den tilbage rigtigt som forventet:

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

Her opretter vi en midlertidig fil og ringer derefter til Files.exists (sti) metode.

Dette fungerer endda for mapper:

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

Hvis vi specifikt vil vide, om der findes en fil eller et bibliotek, kan vi også bruge det Files.isDirectory (sti) eller Files.isRegularFile (sti) metoder:

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

Der er også en notExists (sti) metode, der vender tilbage rigtigt hvis det er givet Sti findes ikke:

assertFalse (Files.notExists (tempDirectory));

Undertiden Files.exists (sti) vender tilbage falsk fordi vi ikke har de nødvendige filtilladelser. I sådanne scenarier kan vi bruge Files.isReadable (sti) metode til at sikre, at filen faktisk kan læses af den nuværende bruger:

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

2.1. Symbolske links

Som standard er Files.exists (sti) metode følger de symbolske links. Hvis filen EN har et symbolsk link til filen B, derefter Files.exists (A) metoden vender tilbage rigtigt hvis og kun hvis filen B eksisterer allerede:

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

Hvis vi nu sletter målet for linket, bliver Files.exists (sti) kommer tilbage falsk:

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

Da linkmålet ikke eksisterer længere, vil følgende link ikke føre til noget, og Files.exists (sti) kommer tilbage falsk.

Det er endda muligt ikke at følge de symbolske links ved at passere en passende LinkValg som det andet argument:

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

Fordi selve linket findes, er Files.exists (sti) metoden vender tilbage rigtigt. Vi kan også kontrollere, om en Sti er et symbolsk link ved hjælp af Files.isSymbolicLink (sti) metode:

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

3. Brug java.io-fil

Hvis vi bruger Java 7 eller en nyere version af Java, anbefales det stærkt at bruge de moderne Java NIO API'er til disse slags krav.

For at sikre, at der findes en fil eller et bibliotek i Java-arv IO-verdenen, kan vi ringe til eksisterer () metode til Fil tilfælde:

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

Hvis filen eller biblioteket allerede findes, vender den tilbage rigtigt:

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

Som vist ovenfor, det eksisterer () metode er ligeglad med, om det er en fil eller et bibliotek. Derfor, så længe den findes, vender den tilbage rigtigt.

Det isFile () metoden returnerer dog rigtigt hvis den givne sti er en eksisterende fil:

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

Tilsvarende er isDirectory () metoden vender tilbage rigtigt hvis den givne sti er en eksisterende mappe:

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

Endelig blev canLæs () metoden vender tilbage rigtigt hvis filen er læsbar:

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

Når det vender tilbage falsk, findes filen enten ikke, eller den nuværende bruger har ikke læsetilladelsen på filen.

4. Konklusion

I denne korte vejledning så vi, hvordan vi kan sikre, at der findes en fil eller mappe i Java. Undervejs talte vi om moderne NIO og de ældre IO API'er. Vi så også, hvordan NIO API håndterer symbolske links.

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