File.getCanonicalPath()失败示例

gig*_*dot 14 java file-io

有没有人有经验或知道什么时候该方法File.getCanonicalPath()会抛出一个IOException

我试图从互联网上查找,最好的答案是在File API中说的

" IOException- 如果发生I/O错误,这是可能的,因为规范路径名的构造可能需要文件系统查询"

但是,我不清楚,因为我仍然无法想到这可能会失败的情况.谁能给我具体的例子,可以在Linux,Windows和其他操作系统上发生(可选)?

我之所以想知道是因为我想相应地处理这个异常.因此,如果我知道可能发生的所有可能的故障,那将是最好的.

dog*_*ane 18

这是一个Windows示例:

尝试调用getCanonicalFileCD驱动器中的文件,但不加载CD.例如:

new File("D:\\dummy.txt").getCanonicalFile();
Run Code Online (Sandbox Code Playgroud)

你会得到:

Exception in thread "main" java.io.IOException: The device is not ready
    at java.io.WinNTFileSystem.canonicalize0(Native Method)
    at java.io.Win32FileSystem.canonicalize(Win32FileSystem.java:396)
    at java.io.File.getCanonicalPath(File.java:559)
    at java.io.File.getCanonicalFile(File.java:583)
Run Code Online (Sandbox Code Playgroud)


And*_*wNR 6

如果我们尝试使用用作文件名的Windows设备文件关键字(请参阅设备文件)创建File对象,也会发生IO异常.
好像您尝试将文件重命名为这些关键字,Windows将不允许您创建它(不允许使用CON,PRN,COM1等文件名),Java也无法将该文件名转换为正确的路径.

因此,下一个代码中的任何一个都会抛出IO异常:

File file = new File("COM1").getContextPath();
File file = new File("COM1.txt").getContextPath();
File file = new File("C:/somefolder/COM1.txt").getContextPath();
Run Code Online (Sandbox Code Playgroud)

但是,下一个代码应该工作:

File file = new File("COM1_.txt").getContextPath();  //underscore wins :)
Run Code Online (Sandbox Code Playgroud)


urs*_*rsa 5

以下是所有操作系统的通用示例:

new File("\u0000").getCanonicalFile();
Run Code Online (Sandbox Code Playgroud)

在规范化文件之前,使用 java.io.File#isInvalid 检查其有效性:

final boolean isInvalid() {
    if (status == null) {
        status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED
                                                   : PathStatus.INVALID;
    }
    return status == PathStatus.INVALID;
}
Run Code Online (Sandbox Code Playgroud)

如果文件无效 - 您将收到 IO 异常:

public String getCanonicalPath() throws IOException {
    if (isInvalid()) {
        throw new IOException("Invalid file path");
    }
    return fs.canonicalize(fs.resolve(this));
}
Run Code Online (Sandbox Code Playgroud)

利润!