2012-07-02 34 views
20

Nếu tôi làm điều này:Kiểm tra nếu tập tin tồn tại mà không cần tạo nó

File f = new File("c:\\text.txt"); 

if (f.exists()) { 
    System.out.println("File exists"); 
} else { 
    System.out.println("File not found!"); 
} 

Sau đó, các tập tin được tạo ra và luôn luôn trả về "File tồn tại". Có thể kiểm tra xem tệp có tồn tại mà không tạo tệp không?

EDIT:

tôi quên đề cập đến nó trong một vòng lặp for. Vì vậy, đây là điều thực tế:

for (int i = 0; i < 10; i++) { 
    File file = new File("c:\\text" + i + ".txt"); 
    System.out.println("New file created: " + file.getPath()); 
} 
+0

bản sao có thể có của [Làm cách nào để kiểm tra xem tệp có tồn tại không? (Java trên Windows)] (http: // stackoverflow.com/questions/1816673/how-do-i-check-if-a-file-tồn tại-java-trên-windows) – MarcoS

+1

@MarcoS: thực sự nó không phải là một bản sao. Tiêu đề của câu hỏi này chỉ đơn giản là nói xấu. –

+0

@ JoachimSauer: có lẽ nó không phải là một bản sao chính xác, nhưng câu trả lời có thể suy ra bằng cách đọc câu hỏi đó và thử một chút mã ... vì vậy đối với tôi đó là một bản sao – MarcoS

Trả lời

46

Khi bạn instanciate một File, bạn không tạo bất cứ thứ gì trên đĩa mà chỉ tạo một đối tượng mà bạn có thể gọi một số phương thức, như exists().

Điều đó tốt và rẻ, đừng cố tránh sự kiện này.

Các dụ File chỉ có hai lĩnh vực:

private String path; 
private transient int prefixLength; 

Và đây là các nhà xây dựng:

237  public File(String pathname) { 
238   if (pathname == null) { 
239    throw new NullPointerException(); 
240   } 
241   this.path = fs.normalize(pathname); 
242   this.prefixLength = fs.prefixLength(this.path); 
243  } 

Như bạn có thể thấy, ví dụ File chỉ là một đóng gói của con đường. Tạo nó để gọi exists() là cách chính xác để tiếp tục. Đừng cố gắng tối ưu hóa nó đi.

+5

@ThreaT: trái với ý kiến ​​chung, chạy mã bên trong một vòng lặp không ** không ** về cơ bản thay đổi mã nào. –

+1

@ThreaT nếu mã 'Tệp mới' nằm trong vòng lặp, bạn có thể có lỗi mã hóa không hiệu quả, nhưng nó vẫn không tạo ra tệp thực. Nếu tệp của bạn tồn tại, nó hoàn toàn không phải do lớp File. – mah

+0

@ThreaT Không có gì phải lo lắng. Nghiêm túc, đó là thực sự rẻ. Đó không thực sự nhiều hơn là sự đóng gói của con đường của bạn. –

10

Tạo cá thể File không tạo tệp trên hệ thống tệp, vì vậy mã được đăng sẽ thực hiện những gì bạn yêu cầu.

+0

@ThreaT, hoàn toàn không liên quan. Để tạo một tệp bằng cách sử dụng 'File', bạn cần gọi' File.createNewFile() '. – hmjd

+0

@ThreaT, vòng lặp 'for' sẽ không tạo tệp. Nó sẽ in ra thông báo "New file created ...." nhưng tập tin này sẽ không tồn tại trên hệ thống tập tin của bạn. Thêm 'file.exists()' vào thư của bạn và nó sẽ là 'false' (giả sử chúng không tồn tại). – hmjd

2

Bắt đầu từ Java 7 bạn có thể sử dụng java.nio.file.Files.exists:

Path p = Paths.get("C:\\Users\\first.last"); 
boolean exists = Files.exists(p); 
boolean notExists = Files.notExists(p); 

if (exists) { 
    System.out.println("File exists!"); 
} else if (notExists) { 
    System.out.println("File doesn't exist!"); 
} else { 
    System.out.println("File's status is unknown!"); 
} 

Trong Oracle tutorial bạn có thể tìm thấy một số thông tin chi tiết về vấn đề này:

Các phương pháp trong lớp Path là cú pháp, có nghĩa là chúng hoạt động trên phiên bản Path. Nhưng cuối cùng bạn phải truy cập vào hệ thống tệp để xác minh rằng một số Path cụ thể tồn tại hoặc không tồn tại. Bạn có thể làm như vậy với các phương thức exists(Path, LinkOption...)notExists(Path, LinkOption...). Lưu ý rằng !Files.exists(path) không tương đương với Files.notExists(path). Khi bạn đang kiểm tra sự tồn tại của tệp, có thể có ba kết quả:

  • Tệp được xác minh là tồn tại.
  • Tệp được xác minh là không tồn tại.
  • Trạng thái của tệp không xác định. Kết quả này có thể xảy ra khi chương trình không có quyền truy cập vào tệp.

Nếu cả hai existsnotExists trả lại false, sự tồn tại của tệp không thể xác minh được.

+0

Xin chào quê hương Romania :-) – Flavius

Các vấn đề liên quan