Kiểm tra xem tệp hoặc thư mục có tồn tại trong Java không

1. Khái quát chung

Trong hướng dẫn nhanh này, chúng ta sẽ làm quen với các cách khác nhau để kiểm tra sự tồn tại của một tệp hoặc thư mục.

Đầu tiên, chúng ta sẽ bắt đầu với các API NIO hiện đại và sau đó sẽ đề cập đến các phương pháp tiếp cận IO kế thừa.

2. Sử dụng java.nio.file.Files

Để kiểm tra xem tệp hoặc thư mục có tồn tại hay không, chúng ta có thể sử dụng phương thức Files.exists (Đường dẫn) . Vì nó rõ ràng từ chữ ký phương thức, trước tiên chúng ta nên lấy Đường dẫn đến tệp hoặc thư mục dự định. Sau đó, chúng ta có thể chuyển Đường dẫn đó đến phương thức Files.exists (Đường dẫn) :

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

Vì tệp không tồn tại, nó trả về false . Cũng cần nhắc lại rằng nếu phương thức Files.exists (Path) gặp IOException , nó cũng sẽ trả về false .

Mặt khác, khi tệp đã cho tồn tại, nó sẽ trả về true như mong đợi:

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

Ở đây chúng tôi đang tạo một tệp tạm thời và sau đó gọi phương thức Files.exists (Đường dẫn) .

Điều này thậm chí hoạt động cho các thư mục :

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

Nếu chúng tôi đặc biệt muốn biết liệu một tệp hoặc thư mục có tồn tại hay không, chúng tôi cũng có thể sử dụng các phương thức Files.isDirectory (Đường dẫn) hoặc Files.isRegularFile (Đường dẫn) :

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

Cũng có một phương thức notExists (Đường dẫn) trả về true nếu Đường dẫn đã cho không tồn tại:

assertFalse(Files.notExists(tempDirectory));

Đôi khi, Files.exists (Đường dẫn) trả về false bởi vì chúng tôi không có quyền đối với tệp cần thiết . Trong các trường hợp như vậy, chúng ta có thể sử dụng phương thức Files.isReadable (Đường dẫn) để đảm bảo rằng người dùng hiện tại thực sự có thể đọc được tệp:

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

2.1. Liên kết tượng trưng

Theo mặc định, phương thức Files.exists (Đường dẫn) theo sau các liên kết tượng trưng . Nếu tệp A có một liên kết tượng trưng đến tệp B , thì phương thức Files.exists (A) trả về true nếu và chỉ khi tệp B đã tồn tại:

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));

Bây giờ nếu chúng ta xóa mục tiêu của liên kết, Files.exists (Đường dẫn) sẽ trả về false :

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

Vì mục tiêu liên kết không tồn tại nữa, việc đi theo liên kết sẽ không dẫn đến bất cứ điều gì và Files.exists (Đường dẫn) sẽ trả về false .

Thậm chí có thể không tuân theo các liên kết tượng trưng bằng cách chuyển một LinkOption thích hợp làm đối số thứ hai:

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

Vì bản thân liên kết tồn tại, phương thức Files.exists (Đường dẫn) trả về true. Ngoài ra, chúng ta có thể kiểm tra xem Đường dẫn có phải là một liên kết tượng trưng hay không bằng cách sử dụng phương thức Files.isSymbolicLink (Đường dẫn) :

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

3. Sử dụng java.io.File

Nếu chúng tôi đang sử dụng Java 7 hoặc phiên bản Java mới hơn, chúng tôi khuyên bạn nên sử dụng các API Java NIO hiện đại cho các loại yêu cầu này .

Tuy nhiên, để đảm bảo liệu một tệp hoặc thư mục có tồn tại trong thế giới IO kế thừa của Java hay không, chúng ta có thể gọi phương thức being () trên các phiên bản File :

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

Nếu tệp hoặc thư mục đã tồn tại, nó sẽ trả về true :

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());

Như đã trình bày ở trên, những tồn tại () phương pháp không quan tâm nếu đó là một tập tin hoặc thư mục. Do đó, miễn là nó tồn tại, nó sẽ trả về true .

Các () isFile phương pháp, tuy nhiên, trả về đúng nếu con đường nhất định là một tập tin hiện có:

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

Tương tự, phương thức isDirectory () trả về true nếu đường dẫn đã cho là một thư mục hiện có:

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

Cuối cùng, phương thức canRead () trả về true nếu tệp có thể đọc được:

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

Khi nó trả về false , tệp không tồn tại hoặc người dùng hiện tại không có quyền đọc trên tệp.

4. Kết luận

Trong hướng dẫn ngắn này, chúng ta đã biết cách đảm bảo tệp hoặc thư mục tồn tại trong Java. Trong quá trình này, chúng ta đã nói về NIO hiện đại và các API IO kế thừa. Ngoài ra, chúng tôi đã thấy cách API NIO xử lý các liên kết tượng trưng.

Như thường lệ, tất cả các ví dụ đều có sẵn trên GitHub.