Tôi sẽ hoàn thành câu trả lời rất tốt của @mmcrae
.
Có bất kỳ lý do để sử dụng một đối tượng java.io.File nữa hay chúng ta có thể xem xét nó không dùng nữa?
Các lớp JDK rất hiếm khi bị phản đối.
Bạn có thể thấy trên API JDK 8 không dùng nữa liệt kê tất cả các lớp không dùng nữa kể từ JDK đầu tiên.
Nó chỉ chứa một phần nhỏ các lớp mà tài liệu Oracle và cộng đồng Java không khuyến khích sử dụng.
java.util.Date
, java.util.Vector
, java.util.Hashtable
... đó là lớp học với rất nhiều khiếm khuyết không phản đối.
Nhưng tại sao ?
Bởi vì về mặt khái niệm một cái gì đó deprecated
có nghĩa là vẫn còn nhưng không khuyến khích sử dụng vì nó chắc chắn sẽ bị loại bỏ.
Hàng ngàn chương trình dựa vào các lớp được thiết kế xấu này.
Đối với các lớp như vậy, các nhà phát triển API Java sẽ không đưa ra tín hiệu như vậy.
Câu trả lời @EJP
là rất đúng:
Không trừ khi và cho đến khi nó được đánh dấu như vậy trong Javadoc.
Vì vậy, tôi nghĩ rằng câu hỏi của bạn sẽ có ý nghĩa hơn trong các điều khoản của nó:
"Khi chúng ta có sự lựa chọn, chúng ta nên sử dụng java.io.File
hoặc java.nio.file.Path
cho các phát triển mới và nếu câu trả lời là java.nio.file.Path
, bạn có thể dễ dàng tận dụng java.io.File
các dự án cũ java.io.File
không?"
Tôi tin rằng một java.nio.file.Path có thể làm mọi thứ mà java.io.File có thể làm và hơn thế nữa.
Bạn có câu trả lời.
Hướng dẫn tiên tri này về di sản IO xác nhận suy nghĩ của bạn.
Trước khi phát hành Java SE 7, java.io.File
lớp là cơ chế được sử dụng cho tệp I / O, nhưng nó có một số nhược điểm.
Nhiều phương pháp đã không đưa ra ngoại lệ khi chúng thất bại, vì vậy không thể có được thông báo lỗi hữu ích. Ví dụ: nếu xóa tệp không thành công, chương trình sẽ nhận được "xóa thất bại" nhưng sẽ không biết có phải do tệp không tồn tại hay không, người dùng không có quyền hoặc có một số vấn đề khác.
Phương thức đổi tên không hoạt động nhất quán trên các nền tảng. Không có hỗ trợ thực sự cho các liên kết tượng trưng.
Cần hỗ trợ thêm cho siêu dữ liệu, như quyền tệp, chủ sở hữu tệp và các thuộc tính bảo mật khác.
Truy cập siêu dữ liệu tập tin là không hiệu quả.
Nhiều phương thức File không mở rộng được. Yêu cầu một danh sách thư mục lớn trên một máy chủ có thể dẫn đến treo. Các thư mục lớn cũng có thể gây ra sự cố tài nguyên bộ nhớ, dẫn đến việc từ chối dịch vụ.
Không thể viết mã đáng tin cậy có thể đệ quy một cây tập tin và trả lời thích hợp nếu có các liên kết tượng trưng tròn.
Với rất nhiều nhược điểm java.io.File
, chúng tôi thực sự không cần lý do để sử dụng lớp này cho các phát triển mới.
Và ngay cả đối với mã kế thừa sử dụng java.io.File
, Oracle đưa ra gợi ý để sử dụng Path
.
Có lẽ bạn có mã kế thừa sử dụng java.io.File và muốn tận dụng chức năng java.nio.file.Path với tác động tối thiểu đến mã của bạn.
Lớp java.io.File cung cấp phương thức toPath, nó chuyển đổi một thể hiện tệp kiểu cũ thành một thể hiện java.nio.file.Path, như sau:
Path input = file.toPath();
Sau đó, bạn có thể tận dụng bộ tính năng phong phú có sẵn cho lớp Đường dẫn.
Ví dụ: giả sử bạn có một số mã đã xóa một tệp:
file.delete();
Bạn có thể sửa đổi mã này để sử dụng phương thức Files.delete, như sau:
Path fp = file.toPath();
Files.delete(fp);