为什么新的File(File parent,String childName)表现得不明显?

时间:2016-05-06 07:24:53

标签: java file

如果我创建这样的文件,我会被堆叠一段时间以下行为:

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 目录作为父级的孩子?

1 个答案:

答案 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.getDefaultParentFileSystem.resolveFileSystem.normalize是抽象的,因此具体行为并不是立即明显的;但是,假设不同的代码路径会导致不同的行为是不合理的。