API java.nio.file.Files
là một cải tiến thực sự tốt đẹp so với lớp học cũ java.io.File
, nhưng một chi tiết đánh tôi là lẻ; ngoại trừ delete()
không có phương pháp nào tài liệu mà họ có thể ném NoSuchFileException
và thậm chí delete()
cho biết đây là tùy chọn.Tôi có thể tin tưởng các phương thức trong Tệp sẽ ném NoSuchFileException khi được mong đợi không?
Tôi muốn có thể phân biệt giữa các lỗi do thiếu tệp và các sự cố IO khác, nhưng có vẻ như điều này không được đảm bảo là có thể.
Cách thay thế gọi Files.exists()
và các khoản tương tự trước đó sẽ có nguy cơ xảy ra tình trạng chủng tộc nếu tệp được tạo ở giữa hai thao tác.
Tôi có thể mong đợi các phương thức trong Files
sẽ tăng NoSuchFileException
khi thích hợp không? Nếu vậy, tài liệu này ở đâu? Nếu không, làm thế nào tôi có thể xác định một cách an toàn sự thất bại là do một tập tin bị thiếu?
Ví dụ: Trên Windows 7 với Java 7.0.02 phương pháp Files.readAllLines()
không nâng cao một NoSuchFileException
, mặc dù nó không phải tài liệu một cách rõ ràng để làm như vậy:
Files.readAllLines(Paths.get("foo"), StandardCharsets.UTF_8)
java.nio.file.NoSuchFileException: foo at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102) at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:229) at java.nio.file.Files.newByteChannel(Files.java:315) at java.nio.file.Files.newByteChannel(Files.java:361) at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:380) at java.nio.file.Files.newInputStream(Files.java:106) at java.nio.file.Files.newBufferedReader(Files.java:2660) at java.nio.file.Files.readAllLines(Files.java:2993)
Tôi hỏi về phần còn lại của API, không chỉ các phương thức 'delete()'/'deleteIfExists()'. Phần còn lại của API (ví dụ: 'readAllLines()') không ghi lại rằng nó làm tăng 'NoSuchFileException', mặc dù nó có vẻ như vậy (ít nhất là trên Windows). Ngay cả 'delete()' chỉ ra đây là một ngoại lệ tùy chọn, cho thấy người gọi không thể dựa vào hành vi này. – dimo414