【发布时间】:2015-03-17 05:34:30
【问题描述】:
java.nio.file.Files API 是对旧的 java.io.File 类的一个非常好的改进,但有一个细节让我觉得很奇怪;除了delete() 之外,没有任何方法记录它们可能会抛出NoSuchFileException,甚至delete() 都表示这是可选的。
我希望能够区分由于丢失文件和其他 IO 问题而导致的故障,但似乎不能保证这是可能的。
如果文件是在两个操作之间创建的,则预先调用 Files.exists() 等的替代方法会冒竞争条件的风险。
我可以期望Files 中的方法会在适当的时候引发NoSuchFileException 吗?如果是这样,这在哪里记录?如果不是,我怎样才能安全地确定失败是由于文件丢失引起的?
示例:在带有 Java 7.0.02 的 Windows 7 上,Files.readAllLines() 方法确实会引发 NoSuchFileException,尽管没有明确记录这样做:
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)
【问题讨论】: