有没有人有经验或知道什么时候该方法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)
如果我们尝试使用用作文件名的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)
以下是所有操作系统的通用示例:
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)
利润!