如果我创建这样的文件,我会被堆叠一段时间以下行为:
new File("");
然后它将指向项目工作目录,在我的情况下C:/project/
。如果像这样创建文件:
new File("image");
然后它将相对于项目目录,在我的情况下C:/project/image/
。一切都很好,但如果我使用new File(File parent, String childName)
构造函数创建文件,如下所示:
new File(new File(""), "image");
然后它将指向C:/image/
,我从根目录开始。我发现它是记录在案的行为:
如果
parent
是空的抽象路径名,那么新的File
实例是通过转换child
创建的 到一个抽象的路径名并解决一个结果 系统相关的默认目录。
但为什么呢?有什么缘故吗?或者“仅仅因为”?为什么如果我将new File("")
作为当前目录的点,作为父级,我会收到 root 目录作为父级的孩子?
答案 0 :(得分:1)
source code显示了存在差异的原因:
/**
* The FileSystem object representing the platform's local file system.
*/
private static final FileSystem fs = DefaultFileSystem.getFileSystem();
// Snip.
public File(File parent, String child) {
if (child == null) {
throw new NullPointerException();
}
if (parent != null) {
if (parent.path.equals("")) {
this.path = fs.resolve(fs.getDefaultParent(),
fs.normalize(child));
} else {
this.path = fs.resolve(parent.path,
fs.normalize(child));
}
} else {
this.path = fs.normalize(child);
}
this.prefixLength = fs.prefixLength(this.path);
}
VS
public File(String pathname) {
if (pathname == null) {
throw new NullPointerException();
}
this.path = fs.normalize(pathname);
this.prefixLength = fs.prefixLength(this.path);
}
即。如果您将new File("")
作为parent
参数传递,则会在解析路径时考虑FileSystem
的默认父级。
所有方法FileSystem.getDefaultParent
,FileSystem.resolve
和
FileSystem.normalize
是抽象的,因此具体行为并不是立即明显的;但是,假设不同的代码路径会导致不同的行为是不合理的。