为什么只有一个路径包含根元素时,Java 7的新Path对象无法进行相对化?

5
根据 java.nio.file.Path

如果只有一个路径具有根组件,则无法构建相对路径。

为什么会这样?为什么不能像这样进行相对化:
Path path1 = Paths.get("/home/test");
Path path2 = Paths.get("home");

// throws an IllegalArgumentException
Path path3 = path1.relativize(path2);

我原以为path3会得到相对路径../。如果没有定义根元素,为什么Path可以返回表明两个目录在文件系统中处于同一级别的结果,而当只有一个路径定义了根元素(如上所示)时,无法确定相对路径?
即:
Path path1 = Paths.get("home/test");
Path path2 = Paths.get("user");

// results in ../../user
Path path3 = path1.relativize(path2);
1个回答

5

非绝对路径是相对于某个未指定的基本目录而言的。如果您有两个这样的路径,那么想象它们相对于相同(但仍未指定)的基本目录,询问其中一个相对于另一个的位置就有意义了。

另一方面,如果您有两个路径,其中只有一个是绝对路径,例如/home/testhome,那么就不知道它们之间的关系。例如,如果基本目录恰好是/home/test/blah,那么home表示/home/test/blah/home,因此应该将其转换为blah/home。但是该方法如何知道如何发明blah(或发明其他完全不同的东西)?

使用相对路径的整个重点是说,“我现在还没有告诉你”这个路径名所用的基本目录是什么。期望运行时库“猜测”我们明确未告诉它的基本路径,这完全与语义相违背。


1
为什么想象它们相对于同一个基本目录有“一定的道理”?如果它们不是呢? - wulfgarpro
3
假设它们最终将有相同的基目录可能有意义,但即使您还不知道该目录是什么,也可以选择不使用该函数。另一方面,假设非绝对字符串最终将被解释为相对于根的路径并没有任何特别的意义。如果您已经知道基路径,最好使用绝对路径。在您已知基础路径的所有情况中,特定为“/”的情况很少见,因此不应成为默认的、静默的假设。 - hmakholm left over Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接