Provjerite postoji li datoteka ili direktorij u Javi

1. Pregled

U ovom brzom vodiču upoznat ćemo se s različitim načinima provjere postojanja datoteke ili direktorija.

Prvo ćemo započeti s modernim NIO API-ima, a zatim ćemo obraditi naslijeđene IO pristupe.

2. Korištenje java.nio.file.File

Da bismo provjerili postoji li datoteka ili direktorij, možemo koristiti Files.exists (Put) metoda. Kao što je jasno iz potpisa metode, prvo bismo trebali dobiti a Staza u predviđenu datoteku ili direktorij. Tada to možemo proći Staza prema Files.exists (Put) metoda:

Put puta = Paths.get ("ne-ne postoji.txt"); assertFalse (Files.exists (path));

Budući da datoteka ne postoji, vraća se lažno. Također je vrijedno spomenuti da ako Files.exists (Put) metoda nailazi na IOException, vratit će se lažno, isto.

S druge strane, kad data datoteka postoji, vratit će se pravi kako se očekuje:

Put tempFile = Files.createTempFile ("baeldung", "существуj-članak"); assertTrue (Files.exists (tempFile));

Ovdje stvaramo privremenu datoteku, a zatim pozivamo datoteku Files.exists (Put) metoda.

To čak radi i za direktorijume:

Put tempDirectory = Files.createTempDirectory ("baeldung-postoji"); assertTrue (Files.exists (tempDirectory));

Ako izričito želimo znati postoji li datoteka ili direktorij, također možemo koristiti Files.isDirectory (Put) ili Files.isRegularFile (Put) metode:

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

Tu je i notExists (Put) metoda koja se vraća pravi ako je dato Staza ne postoji:

assertFalse (Files.notExists (tempDirectory));

Ponekad Files.exists (Put) vraća se lažno jer nemamo potrebna dopuštenja za datoteke. U takvim scenarijima možemo koristiti Files.isReadable (Put) metoda kako bi se osiguralo da datoteku stvarno čita trenutni korisnik:

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

2.1. Simboličke poveznice

Prema zadanim postavkama Files.exists (Put) metoda slijedi simboličke poveznice. Ako datoteka A ima simboličku poveznicu na datoteku B, onda Files.exists (A) metoda se vraća pravi ako i samo ako je datoteka B već postoji:

Cilj puta = Files.createTempFile ("baeldung", "target"); Simbol puta = Paths.get ("test-link-" + ThreadLocalRandom.current (). NextInt ()); Putanja symbolicLink = Files.createSymbolicLink (simbol, cilj); assertTrue (Files.exists (symbolicLink));

Sada ako izbrišemo cilj veze, Files.exists (Put) će se vratiti lažno:

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

Budući da cilj veze više ne postoji, praćenje veze neće dovesti do ničega, a Files.exists (Put) će se vratiti lažno.

Moguće je i ne slijediti simboličke poveznice dodavanjem odgovarajućeg LinkOption kao drugi argument:

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

Budući da sama veza postoji, Files.exists (Put) metoda se vraća pravi. Također, možemo provjeriti je li a Staza je simbolička poveznica koja koristi Files.isSymbolicLink (Put) metoda:

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

3. Korištenje java.io.Datoteka

Ako koristimo Javu 7 ili noviju verziju Jave, toplo se preporučuje korištenje modernih Java NIO API-ja za ove vrste zahtjeva.

Međutim, kako bismo bili sigurni postoji li datoteka ili direktorij u naslijeđenom IO svijetu Java, možemo nazvati postoji () metoda na Datoteka primjerci:

assertFalse (nova datoteka ("nevaljana"). postoji ());

Ako datoteka ili direktorij već postoji, vratit će se pravi:

Put tempFilePath = Files.createTempFile ("baeldung", "существу-io"); Put tempDirectoryPath = Files.createTempDirectory ("baeldung-существу-io"); Datoteka tempFile = nova datoteka (tempFilePath.toString ()); Datoteka tempDirectory = nova datoteka (tempDirectoryPath.toString ()); assertTrue (tempFile.exists ()); assertTrue (tempDirectory.exists ());

Kao što je prikazano gore, the postoji () metodu nije briga je li riječ o datoteci ili direktoriju. Stoga će se, dok postoji, vraćati pravi.

The isFile () metoda, međutim, vraća se pravi ako je zadana staza postojeća datoteka:

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

Slično tome, isDirectory () metoda se vraća pravi ako je zadani put postojeći direktorij:

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

Napokon, canRead () metoda se vraća pravi ako je datoteka čitljiva:

assertTrue (tempFile.canRead ()); assertFalse (nova datoteka ("/ root / .bashrc"). canRead ());

Kad se vrati lažno, datoteka ili ne postoji ili trenutni korisnik nema dozvolu za čitanje na datoteci.

4. Zaključak

U ovom kratkom vodiču vidjeli smo kako osigurati postojanje datoteke ili direktorija u Javi. Usput smo razgovarali o modernom NIO-u i naslijeđenim IO API-ima. Također, vidjeli smo kako NIO API obrađuje simboličke poveznice.

Kao i obično, svi su primjeri dostupni na GitHubu.