Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
新文件(“new File”)与新文件(“new File”):功能还是Bug?_File_Io_Java - Fatal编程技术网

新文件(“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
。获取空字符串目录的原因在of
getAbsolutePath
中描述:

如果此抽象路径名为空 抽象路径名,然后是路径名 当前用户目录的字符串, 它由系统属性命名 返回user.dir


使用带空字符串的构造函数时,将创建一个具有两个属性的文件实例:

  • 它实际上并不存在
  • 其绝对路径名为“空抽象路径名”
使用文件(“.”)时,您将创建一个不同的文件:

  • 它确实存在于文件系统中
  • 其绝对路径名包含“.”字符
第二个文件存在,而不是第一个。因此,第二个文件是唯一应该遵守getCanonicalPath中解释的规则的文件:

表示现有文件或目录的每个路径名都具有唯一的规范形式

由于第一个文件不是实文件,它们的规范路径相等这一事实毫无意义

因此,您指出的Behvious不是一个bug。这是我们期望从JVM得到的


可能也希望在不同的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