Periksa Jika Fail atau Direktori Ada di Java

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan membiasakan diri dengan berbagai cara untuk memeriksa keberadaan file atau direktori.

Pertama, kita akan mulakan dengan API NIO moden dan kemudian akan merangkumi pendekatan IO yang lama.

2. Menggunakan java.nio.file.Files

Untuk memeriksa sama ada fail atau direktori wujud, kita boleh memanfaatkan Files.exists (jalan) kaedah . Seperti yang jelas dari tanda tangan kaedah, pertama-tama kita harus mendapatkan Path ke file atau direktori yang dimaksudkan. Kemudian kita dapat meneruskan kaedah Path to the Files.exists (Path) :

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

Oleh kerana fail tersebut tidak ada, fail tersebut akan menjadi palsu . Perlu juga disebutkan bahawa jika kaedah Files.exists (Path) menemui IOException , ia juga akan kembali palsu .

Sebaliknya, apabila fail yang diberikan ada, ia akan kembali benar seperti yang diharapkan:

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

Di sini kita membuat fail sementara dan kemudian memanggil kaedah Files.exists (Path) .

Ini juga berfungsi untuk direktori :

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

Sekiranya kita ingin mengetahui sama ada fail atau direktori ada, kita juga boleh menggunakan kaedah Files.isDirectory (Path) atau Files.isRegularFile (Path) :

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

Terdapat juga kaedah notExists (Path) yang kembali benar jika Path yang diberikan tidak ada:

assertFalse(Files.notExists(tempDirectory));

Kadang-kadang Files.exists (Path) kembali palsu kerana kita tidak mempunyai kebenaran fail yang diperlukan . Dalam senario seperti itu, kita dapat menggunakan kaedah Files.isReadable (Path) untuk memastikan fail tersebut benar-benar dapat dibaca oleh pengguna semasa:

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

2.1. Pautan Simbolik

Secara lalai, kaedah Files.exists (Path) mengikuti pautan simbolik . Sekiranya fail A mempunyai pautan simbolik ke fail B , maka kaedah Files.exists (A) kembali benar jika dan hanya jika fail B sudah ada:

Path target = Files.createTempFile("baeldung", "target"); Path symbol = Paths.get("test-link-" + ThreadLocalRandom.current().nextInt()); Path symbolicLink = Files.createSymbolicLink(symbol, target); assertTrue(Files.exists(symbolicLink));

Sekarang jika kita menghapus sasaran pautan, Files.exists (Path) akan kembali palsu :

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

Oleh kerana sasaran pautan tidak ada lagi, mengikuti pautan tidak akan membawa kepada apa-apa, dan Files.exists (Path) akan kembali palsu .

Bahkan mungkin untuk tidak mengikuti pautan simbolik dengan menyampaikan LinkOption yang sesuai sebagai argumen kedua:

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

Kerana pautan itu sendiri wujud, kaedah Files.exists (Path) kembali benar. Juga, kita dapat memeriksa sama ada Path adalah pautan simbolik menggunakan kaedah Files.isSymbolicLink (Path) :

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

3. Menggunakan java.io.File

Sekiranya kita menggunakan Java 7 atau versi Java yang lebih baru, sangat disarankan untuk menggunakan API Java NIO moden untuk keperluan seperti ini .

Namun, untuk memastikan jika fail atau direktori ada di dunia IO warisan Java, kita dapat memanggil kaedah وجود () pada Instance fail :

assertFalse(new File("invalid").exists());

Sekiranya fail atau direktori sudah ada, ia akan kembali benar :

Path tempFilePath = Files.createTempFile("baeldung", "exist-io"); Path tempDirectoryPath = Files.createTempDirectory("baeldung-exists-io"); File tempFile = new File(tempFilePath.toString()); File tempDirectory = new File(tempDirectoryPath.toString()); assertTrue(tempFile.exists()); assertTrue(tempDirectory.exists());

Seperti yang ditunjukkan di atas, kaedah wujud () tidak peduli sama ada fail atau direktori. Oleh itu, selagi ia wujud, ia akan menjadi kenyataan .

Kaedah isFile () , bagaimanapun, kembali benar jika jalan yang diberikan adalah fail yang ada:

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

Begitu juga, kaedah isDirectory () kembali benar jika jalan yang diberikan adalah direktori yang ada:

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

Akhirnya, kaedah canRead () kembali benar sekiranya fail itu dapat dibaca:

assertTrue(tempFile.canRead()); assertFalse(new File("/root/.bashrc").canRead());

Apabila kembali palsu , fail tersebut tidak ada atau pengguna semasa tidak memiliki izin membaca pada fail tersebut.

4. Kesimpulan

Dalam tutorial ringkas ini, kami melihat bagaimana memastikan fail atau direktori ada di Java. Sepanjang perjalanan, kami membincangkan mengenai NIO moden dan API IO yang lama. Juga, kami melihat bagaimana API NIO mengendalikan pautan simbolik.

Seperti biasa, semua contoh boleh didapati di GitHub.