Java: Kế thừa mã lệnh tập tin I/O
Giải phóng thời gian, khai phóng năng lực
Khả năng tương tác với mã thừa kế
Trước khi phát hành Java SE 7, lớp java.io.File
đã có cơ chế sử dụng cho tập tin I/O, nhưng nó có một số nhược điểm như sau:
- Có nhiều phương thức không thể ném được ngoại lệ khi gặp lỗi, vì vậy nó đã không thể có được thông báo lỗi hữu ích. Ví dụ, nếu xóa một tập tin không thành công, chương trình sẽ nhận được một "lỗi delete" nhưng lại không biết tập tin đó có tồn tại hay không, người dùng không có quyền truy cập, hoặc một số vấn đề khác.
- Phương thức
rename
đã không làm việc liên tục trên các nền tảng. - Không có sự hỗ trợ thực sự cho các liên kết tượng trưng.
- Cần có nhiều hỗ trợ cho siêu dữ liệu, chẳng hạn như các quyền của tập tin, chủ sở hữu tập tin, và các thuộc tính bảo mật khác.
- Truy cập tập tin siêu dữ liệu không hiệu quả.
- Nhiều phương thức của
File
không quy mô. Việ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 hiện tượng bị treo. Các thư mục lớn cũng có thể gây ra các vấn đề về tài nguyên bộ nhớ, kết quả là dịch vụ bị từ chối. - Không thể viết mã đáng tin cậy mà đệ quy có thể đi bộ qua một cây tập tin và đáp ứng một cách thích hợp nếu có liên kết tượng trưng vòng.
Lớp java.io.File
cung cấp phương thức toPath
, phương thức này sẽ chuyển đổi thể hiện của File
thành thể hiện của java.nio.file.Path
như sau:
Path input = file.toPath();
Từ đó bạn có thể tận dụng lợi thế của các tính năng phong phú có sẵn của lớp Path
.
Ví dụ, giả sử bạn có câu lệnh xóa một tập tin như sau:
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);
Ngược lại, phương thức Path.toFile
sẽ tạo một đối tượng java.io.File
cho đối tượng Path
.
Ánh xạ chức năng java.io.File tới java.nio.file
Do Java thực thi tập tin I/O đã hoàn thiện cấu trúc từ phiên bản Java SE 7, nên bạn không thể trao đổi phương thức với phương thức. Nếu bạn muốn sử dụng các chức năng phong phú được cung cấp bởi gói java.nio.file
, thì giải pháp dễ dàng nhất là sử dụng phương thức File.toPath
như đã đề cập ở trên. Tuy nhiên, nếu bạn không muốn sử dụng giải pháp này hoặc nó không đáp ứng được nhu cầu của bạn thì bạn phải viết lại mã tập tin I/O của bạn.
Không có mối quan hệ một-một giữa hai API với nhau, nhưng bảng dưới đây cho bạn một ý tưởng chung rằng chức năng nào của java.io.File
có thể ánh xạ tới java.nio.file
và cho bạn biết nơi bạn có thể lấy thêm thông tin.
Chức năng của java.io.File
|
Chức năng củajava.nio.file
|
Vị trí
|
---|---|---|
java.io.File |
java.nio.file.Path |
|
java.io.RandomAccessFile |
Chức năng
SeekableByteChannel |
|
File.canRead , canWrite , canExecute |
Files.isReadable , Files.isWritable và Files.isExecutable .Trên các hệ thống tập tin UNIX, gói Managing Metadata (File and File Store Attributes) được sử dụng để kiểm tra 9 quyền tập tin. |
|
File.isDirectory() , File.isFile() và File.length() |
Files.isDirectory(Path, LinkOption...) , Files.isRegularFile(Path, LinkOption...) và Files.size(Path) |
|
File.lastModified() và File.setLastModified(long) |
Files.getLastModifiedTime(Path, LinkOption...) và Files.setLastMOdifiedTime(Path, FileTime) |
|
Các phương thức
File thiết lập các thuộc tính khác nhau: setExecutable , setReadable , setReadOnly , setWritable |
Những phương thức này được thay thế bằng phương thức của
Files là setAttribute(Path, String, Object, LinkOption...) . |
|
new File(parent, "newfile") |
parent.resolve("newfile") |
Điều hành đường dẫn
|
File.renameTo |
Files.move |
|
File.delete |
Files.delete |
|
File.createNewFile |
Files.createFile |
|
File.deleteOnExit |
Thay thế bằng tùy chọn
DELETE_ON_CLOSE được xác định trong phương thức createFile . |
|
File.createTempFile |
Files.createTempFile(Path, String, FileAttributes<?>) , Files.createTempFile(Path, String, String, FileAttributes<?>) |
|
File.exists |
Files.exists và Files.notExists |
|
File.compareTo và equals |
Path.compareTo và equals |
|
File.getAbsolutePath và getAbsoluteFile |
Path.toAbsolutePath |
|
File.getCanonicalPath và getCanonicalFile |
Path.toRealPath hoặc normalize |
|
File.toURI |
Path.toURI |
|
File.isHidden |
Files.isHidden |
|
File.list và listFiles |
Path.newDirectoryStream |
|
File.mkdir và mkdirs |
Path.createDirectory |
|
File.listRoots |
FileSystem.getRootDirectories |
|
File.getTotalSpace , File.getFreeSpace ,File.getUsableSpace |
FileStore.getTotalSpace , FileStore.getUnallocatedSpace , FileStore.getUsableSpace , FileStore.getTotalSpace |
Giải phóng thời gian, khai phóng năng lực