当只有一个Path包含根元素时,为什么Java 7的新Path对象不能重新激活?

wul*_*pro 5 java nio java-7

按照java.nio.file.Path:

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

为什么会这样?为什么不可能像这样重新激活:

Path path1 = Paths.get("/home/test");
Path path2 = Paths.get("home");

// throws an IllegalArgumentException
Path path3 = path1.relativize(path2);
Run Code Online (Sandbox Code Playgroud)

我曾经想过path3会导致相对路径../.Path如果没有定义根元素,为什么返回一个表示文件系统中两个目录位于同一级别的结果是有效的,但是,当只有一个路径定义根元素时(如上所示),没有相对路径可以有待确定?

Path path1 = Paths.get("home/test");
Path path2 = Paths.get("user");

// results in ../../user
Path path3 = path1.relativize(path2);
Run Code Online (Sandbox Code Playgroud)

Hen*_*olm 5

非绝对路径相对于某些未指定的基本目录.如果你有两条这样的路径,那么想象一下它们是相对于同一个(但仍未指定的)基本目录是有道理的,然后它就会有意义地询问一个人相对于另一个人的位置.

另一方面,如果你有两条路径,其中只有一条绝对,例如/home/test并且home不知道那是什么关系.例如,如果基本目录恰好是/home/test/blah,那么home意味着/home/test/blah/home它应该相对于blah/home.但是该方法如何知道如何发明blah(或完全发明其他东西)?

使用相对路径的重点是,我还没有告诉你这个路径名的基本目录是什么.期望运行时库猜测我们明确没有告诉它的基本路径将完全违背该语义.

  • 假设它们最终将具有相同的基本目录,即使您还不知道它是什么,它可能有意义也可能没有意义.只要你知道它没有,你就可以自由地不使用它.另一方面,它没有任何特殊意义,假设非绝对字符串最终将相对于根进行解释.如果您已经知道基数是什么,请使用绝对路径.在你知道基数将会是什么的所有情况中,特别是`/`的情况非常罕见,不能使它成为默认的,无声的假设. (3认同)