新文件(“new File”)与新文件(“new File”):功能还是Bug?
新文件(“new File”)与新文件(“new File”):功能还是Bug?,file,io,java,File,Io,Java,newfile(“”和newfile(“”产生相同的规范路径,但前一个对象是不可描述的。考虑下面的代码,以及两个对象如何返回相同的规范路径。规范路径是“绝对和唯一的”。然而,实际上只有使用“.”参数创建的文件才可用 不应该在某个时候抛出异常吗?在空字符串构造函数调用中(因为创建的对象似乎无效),或者至少在getCanonicalPath中(至少声明IOException) 以及它产生的输出: File constructor argument: "" toString()
newfile(“”
和newfile(“”
产生相同的规范路径,但前一个对象是不可描述的。考虑下面的代码,以及两个对象如何返回相同的规范路径。规范路径是“绝对和唯一的”。然而,实际上只有使用“.”参数创建的文件才可用
不应该在某个时候抛出异常吗?在空字符串构造函数调用中(因为创建的对象似乎无效),或者至少在getCanonicalPath中(至少声明IOException)
以及它产生的输出:
File constructor argument: ""
toString() = ""
getAbsolutePath() = "C:\usr\workspace\Test"
getAbsoluteFile() = "C:\usr\workspace\Test"
getgetCanonicalPath() = "C:\usr\workspace\Test"
getgetCanonicalFile() = "C:\usr\workspace\Test"
exists() = false
isDirectory() = false
File constructor argument: "."
toString() = "."
getAbsolutePath() = "C:\usr\workspace\Test\."
getAbsoluteFile() = "C:\usr\workspace\Test\."
getgetCanonicalPath() = "C:\usr\workspace\Test"
getgetCanonicalFile() = "C:\usr\workspace\Test"
exists() = true
isDirectory() = true
根据javaDocs: 表示现有文件或目录的每个路径名都有一个唯一的规范形式 在第一个示例中,您指的是“没有名称的文件”
由于这个不存在,我认为新文件(“”)和新文件(“.”)产生相同的规范路径不是一个bug。通过向构造函数传递一个空字符串,您创建了一个空的“抽象路径名”。从: 如果给定的字符串为空 字符串,则结果为空 抽象路径名 本例中的“空抽象路径名”实际上不存在,因此
exists()
的计算结果为false
。获取空字符串目录的原因在ofgetAbsolutePath
中描述:
如果此抽象路径名为空
抽象路径名,然后是路径名
当前用户目录的字符串,
它由系统属性命名
返回user.dir
使用带空字符串的构造函数时,将创建一个具有两个属性的文件实例:
- 它实际上并不存在
- 其绝对路径名为“空抽象路径名”
- 它确实存在于文件系统中
- 其绝对路径名包含“.”字符
可能也希望在不同的JVM版本上尝试这一点。JRockIt会给出相同的结果,以查看“如果给定的字符串是空字符串,那么结果就是空的抽象路径名。”我希望
新文件(“.”
在大多数平台上引用当前的工作目录。这与pwd下没有名字的文件截然不同。虽然这个答案没有最多的投票权,但我认为它最好地描述了这里发生的事情。不过,我想指出JavaDoc中的下一句话,“表示不存在的文件或目录的每个路径名也有一个唯一的规范形式”。自由基于奥威尔:所有的规范形式都是唯一的,但有些形式比其他形式更独特……;)
File constructor argument: ""
toString() = ""
getAbsolutePath() = "C:\usr\workspace\Test"
getAbsoluteFile() = "C:\usr\workspace\Test"
getgetCanonicalPath() = "C:\usr\workspace\Test"
getgetCanonicalFile() = "C:\usr\workspace\Test"
exists() = false
isDirectory() = false
File constructor argument: "."
toString() = "."
getAbsolutePath() = "C:\usr\workspace\Test\."
getAbsoluteFile() = "C:\usr\workspace\Test\."
getgetCanonicalPath() = "C:\usr\workspace\Test"
getgetCanonicalFile() = "C:\usr\workspace\Test"
exists() = true
isDirectory() = true