2012-08-27 33 views
12

Tôi đang sử dụng Windows 7 với java 7 cập nhật 6 và thấy hành vi lạ này (ít nhất là đối với tôi) -
Tôi có hai tệp E:\delete1.txtE:\delete2.txt cả hai đều chỉ đọc file, khi tôi cố gắng để xóa tập tin như sau đó bị xóa mà không cần bất kỳ vấn đề -Sự khác biệt giữa Tệp # xóa (Đường dẫn) và Tệp # xóa()

File file = new File("E:\\delete1.txt"); 
assertTrue(file.delete()); 

Nhưng khi tôi xóa tập tin sử dụng API nio như sau -

Path path = Paths.get("E:\\delete2.txt"); 
Files.delete(path); 

Nó ném java.nio.file.AccessDeniedException.

Tại sao hành vi khác nhau cho cùng một hoạt động với API nio cũ và mới?

+0

và nếu bạn trao đổi các tệp bạn đang xóa xung quanh, tức là 'NIO' api xóa' delete1.txt' và tệp api cũ 'Xóa' 'xóa2.txt' điều gì sẽ xảy ra? –

+0

gọi nio bị lỗi trong mọi trường hợp. – Premraj

+2

@MichaelBorgwardt Tại sao lạ? Ông chỉ đơn giản là cố gắng để xóa một tập tin (mà chỉ xảy ra để đọc) – assylias

Trả lời

10

Như được thảo luận here - Vấn đề là java.io.File có nhiều điều kỳ lạ, trên Windows ở cụ thể. Trong trường hợp này, nó đặt lại các thuộc tính tệp trước khi nó xóa tệp vì vậy đây là lý do tại sao nó không bị lỗi như mong đợi. Đó là hành vi có từ 10 năm trở lên và sẽ rất nguy hiểm khi thay đổi ngay bây giờ. Nó có một số khác lạ như thế này, chỉ là một trong những lý do tại sao nó không được tái triển khai để sử dụng API mới.

Nếu chúng tôi cố gắng xóa tệp khỏi cửa sổ lệnh thì các cửa sổ sẽ ném cùng một lỗi (Truy cập bị từ chối) nhưng tệp sẽ bị xóa khỏi cửa sổ trình khám phá. Có vẻ như File#delete() có triển khai sai và thay vào đó, Files#delete(Path) mới nên được ưu tiên.

+0

Điều này có thể được mở rộng để giải thích cụ thể hơn những gì 'File # delete()' có sai không? – ZX9

0

Tại sao hành vi khác nhau cho cùng một hoạt động với API nio cũ và mới?

Vì chính xác mô phỏng hành vi của API cũ cho các hoạt động tương tự rõ ràng không được coi là mục tiêu quan trọng trong thiết kế API mới. Do mục tiêu chính của API hệ thống tệp nio là trình bày một API mới với một số khái niệm cơ bản hoàn toàn khác và rất nhiều khả năng mới, có vẻ như khá bình thường đối với tôi.

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