new File("")
和new File(".")
产生相同的规范路径,但前一个对象是不可子的。请考虑以下代码,以及两个对象如何返回相同的规范路径。文档指出规范路径是"绝对的和唯一的"。然而,只有使用 "." 参数创建的文件才真正可用。
不应该在某个时候抛出异常吗?要么在空字符串构造函数调用中(因为创建的对象似乎无效),要么至少在 getCanonicalPath(至少声明 IOException)中?
import java.io.File;
import java.io.IOException;
public abstract class Test {
public static void main(String[] args) throws Exception {
testFile("");
testFile(".");
}
private static void testFile(String arg) throws IOException {
System.out.format("File constructor argument: "%s"n", arg);
File g = new File(arg);
System.out.format("toString() = "%s"n", g.toString());
System.out.format("getAbsolutePath() = "%s"n", g.getAbsolutePath());
System.out.format("getAbsoluteFile() = "%s"n", g.getAbsoluteFile());
System.out.format("getgetCanonicalPath() = "%s"n", g.getCanonicalPath());
System.out.format("getgetCanonicalFile() = "%s"n", g.getCanonicalFile());
System.out.format("exists() = %sn", g.exists());
System.out.format("isDirectory() = %sn", g.isDirectory());
System.out.println();
}
}
以及它产生的输出:
File constructor argument: ""
toString() = ""
getAbsolutePath() = "C:usrworkspaceTest"
getAbsoluteFile() = "C:usrworkspaceTest"
getgetCanonicalPath() = "C:usrworkspaceTest"
getgetCanonicalFile() = "C:usrworkspaceTest"
exists() = false
isDirectory() = false
File constructor argument: "."
toString() = "."
getAbsolutePath() = "C:usrworkspaceTest."
getAbsoluteFile() = "C:usrworkspaceTest."
getgetCanonicalPath() = "C:usrworkspaceTest"
getgetCanonicalFile() = "C:usrworkspaceTest"
exists() = true
isDirectory() = true
将构造函数与空字符串一起使用时,创建一个具有两个属性的 File 实例:
- 它实际上并不存在。
- 它的绝对路径名是"空的抽象路径名"
使用 File(".") 时,您可以创建一个不同的文件:
- 它确实存在于文件系统上
- 其绝对路径名包含"."字符
第二个文件存在,而不是第一个文件。因此,第二个文件是唯一应该遵守getCanonicalPath中解释的规则的文件:
表示现有文件或目录的每个路径名都具有唯一的规范形式。
由于第一个文件不是真实的,因此它们的规范路径相等这一事实毫无意义。
因此,您指出的行为不是错误。这是我们对JVM的期望。
您将在javadoc中找到所有信息
通过将空字符串传递给构造函数,您将创建一个空的"抽象路径名"。从java.io.File Javadoc:
如果给定字符串为空 字符串,则结果为空 抽象路径名。
在这种情况下,"空抽象路径名"在物理上不存在,因此exists()
计算结果为 false
。您获得空字符串目录的原因在 Javadoc of getAbsolutePath
中描述:
如果此抽象路径名为空 抽象路径名然后路径名 当前用户目录的字符串, 由系统属性命名 user.dir,被返回。
根据javaDocs:
表示现有文件或目录的每个路径名都具有唯一的规范形式。
在第一个示例中,您指的是"没有名称的文件"。
由于那个不存在,我认为新文件(")和新文件(".")不是一个错误。生成相同的规范路径。