Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java File.getCanonicalPath()失败示例_Java_File Io - Fatal编程技术网

Java File.getCanonicalPath()失败示例

Java File.getCanonicalPath()失败示例,java,file-io,Java,File Io,是否有人有经验或知道方法File.getCanonicalPath()何时会引发IOException 我试着从互联网上查找,最好的答案是 IOException-如果发生I/O错误,这是可能的,因为规范路径名的构造可能需要文件系统查询 然而,我并不清楚,因为我仍然无法想象这可能失败的案例。有谁能给我举一个具体的例子,说明Linux、Windows和其他操作系统(可选)上可能发生的情况吗 我想知道的原因是我想相应地处理这个异常。因此,如果我知道所有可能发生的故障,那就最好了。下面是一个Windo

是否有人有经验或知道方法
File.getCanonicalPath()
何时会引发
IOException

我试着从互联网上查找,最好的答案是

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

然而,我并不清楚,因为我仍然无法想象这可能失败的案例。有谁能给我举一个具体的例子,说明Linux、Windows和其他操作系统(可选)上可能发生的情况吗


我想知道的原因是我想相应地处理这个异常。因此,如果我知道所有可能发生的故障,那就最好了。

下面是一个Windows示例:

尝试在CD驱动器中的文件上调用
getCanonicalFile
,但未加载CD。例如:

new File("D:\\dummy.txt").getCanonicalFile();
您将获得:

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)
在这里可以看到

对于JRE 1.4.2_06,当驱动器中没有介质时,可移动驱动器的Windows上的File.getCanonicalPath()不起作用

它在Java1.5中得到了纠正,但您可以看到,这种方法可能存在基于操作系统的问题


我不知道目前有什么问题,但它可能发生,这正是Javadoc所说的。通常在最新的Java版本中会很快修复此问题。

如果尝试创建一个使用Windows设备文件关键字(请参阅)作为文件名的文件对象,也会出现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();
但是,下一个代码应该可以工作:

File file = new File("COM1_.txt").getContextPath();  //underscore wins :)

还有一种情况,当您尝试使用操作系统限制/无效字符作为文件名时

对于Windows
\/:*?“<>|
这些是无效字符。请尝试将文件重命名为:您将收到有关无效字符的气泡/提示消息

尝试下面的Java代码

File file = new File("c:/outputlog-2013-09-20-22:15"); 
//A common scenario when you try to append java.util.Date to create a file like
//File newFile = new File(filename + "_" + new Date());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
如果文件名包含
*?
您将获得java.io.IOException:无效参数
|:
您将获得java.io.IOException:文件名、目录名或卷标语法不正确


当您使用getCanonicalPath()方法时。

如果我们使用任何
“<>
如果文件名中包含char,则getCanonicalPath()方法将失败,但当您尝试创建文件时,将出现无效参数异常

提及


标准形式的精确定义依赖于系统。这里我使用了windows 7。

这里是所有操作系统的通用示例:

new File("\u0000").getCanonicalFile();
在规范化文件之前,使用java.io.file#isInvalid检查其有效性:

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

利润

这是否意味着,如果文件不存在,此方法将失败,还是仅针对可移动驱动器失败?还有,@lagrandmile说它是在Java1.5中修复的?那么这个例子就不再是这样了?@gigadot:你自己试试吧,但我认为它会提高IOExpection。我的例子是关于一个已经修复的bug,但是给出的例子应该总是抛出一个IOException,这就是为什么我在上面加了一个+1:)他们说bug已经修复了,但是在1.6.021上它对我来说失败了。谢谢@LaGrandMere+为你们两人提供1份快速准确的回复。在接受答案之前,我会等一等,看看是否有人能给我更多的例子,但这是目前为止最好的。@dogbane:啊?有趣:)@gigadot:谢谢,我想你不会得到比罗布麻更好的答案,罗布麻的答案非常好:)
public String getCanonicalPath() throws IOException {
    if (isInvalid()) {
        throw new IOException("Invalid file path");
    }
    return fs.canonicalize(fs.resolve(this));
}