包含“点目录”时的Path.relativize行为

时间:2015-12-14 16:18:40

标签: java nio2

关于Path.relativize方法,您可以阅读

  

[...]此方法尝试构造一个相对路径   解决此路径,产生一个定位同一文件的路径   作为给定的路径。例如,在UNIX上,如果此路径为“/ a / b”和   给定的路径是“/ a / b / c / d”,那么得到的相对路径就是   “光盘”。 [...]

所以这个

Path p1 = Paths.get("/a/b");
Path p2 = Paths.get("/a/b/c/d");
System.out.println(p1.relativize(p2));

输出

c\d

只要我理解整个想法就像问“我目前在路径p1给出的位置,我如何从此处获取路径p2?”< / em>的

但对我而言,鉴于/a/b/a/b/.代表相同的位置,我希望上述问题的答案是相同的,而

Path p1 = Paths.get("/a/b/.");
Path p2 = Paths.get("/a/b/c/d");
System.out.println(p1.relativize(p2));

打印

..\c\d

代替。在这种情况下,如果我在p1给出的位置,则应用..\c\d我将不会p2而是\a\c\d,所以...要么就是一些不一致或我的比喻是错误的。那么,你能帮我理解我的隐喻在哪里以及为什么错了?

1 个答案:

答案 0 :(得分:3)

出于.的目的,路径段p1仅被视为另一个名称,而非当前目录的特殊情况。

如果您希望它表示当前目录,normalize路径。

  

此方法的精确定义取决于实现,但是   一般来说,它来自这条路径,一条不包含的路径   冗余的名称元素。在许多文件系统中,"."".."都是   用于表示当前目录和父目录的特殊名称   目录。 在此类文件系统中,会考虑所有出现的"."   冗余。如果".."前面有非".."名称,那么这两个名称   被认为是多余的(识别此类名称的过程是   重复,直到它不再适用。)