对两个完全不同/不相关的绝对路径应用nio相对化有什么意义?

时间:2016-12-16 16:56:11

标签: java nio

我理解以下内容 - 这对我来说很有意义:

    Path path3 = Paths.get("/partA/partB");
    Path path4 = Paths.get("/partA/partC");

    System.out.println(path3.relativize(path4));
    System.out.println(path4.relativize(path3));

打印

  

../ partC

     

../ B部分

据我所知,partB和partC都有一个名为partA的公共父文件夹。因此,这两个路径在逻辑上可以相对化,并且在上面的打印结果中,这是指这个公共父文件夹。

但是当我使用两个完全不相关的绝对路径时,如下所示:

    path3 = Paths.get("/xyz");
    path4 = Paths.get("/folder/abc");

    System.out.println("path3 is absolute - "+path3.isAbsolute()); 
    System.out.println("path4 is absolute - "+path4.isAbsolute()); 

    Path path3a = path3.relativize(path4);
    System.out.println(path3a);
    Path path4a = path4.relativize(path3);
    System.out.println(path4a);

我得到以下结果:

  

path3是绝对的 - 是真的

     

path4是绝对的 - 是真的

     

../文件夹/ ABC

     

../../ XYZ

这对我没有意义。我认为两个不相关的绝对路径可以被相对化,假设它们代表例如本地网络中两个不同计算机的路径。

如果这种理解是正确的那么为什么在第一种情况下我得到../(一个文件夹上层)但在其他情况下我得到../../(两个文件夹上面) - 如果它们都是绝对文件夹网络不应该在网络级别拥有共同的父级吗?也就是说,不应该是以下结果? :

  

../文件夹/ ABC

     

../ XYZ

如果我的理解不正确,那么第二次重新激活背后的逻辑是什么(具有不相关的绝对路径))?这一切在现实生活中的应用是什么?什么时候有用?

当我将此转换为绝对路径时,我会更加迷失:

    Path path3b = path3a.toAbsolutePath();
    Path path4b = path4a.toAbsolutePath();
    Path path3c = path3b.normalize();
    Path path4c = path4b.normalize();
    System.out.println("path3a - "+path3a+" \npath4a - "+path4a);
    System.out.println("path3b - "+path3b+" \npath4b - "+path4b);
    System.out.println("path3c - "+path3c+" \npath4c - "+path4c);

打印:

  

path3a - ../folder/abc

     

path4a - ../../ xyz

     

path3b - /Users/myMac/NetBeansProjects/OCP/../folder/abc

     

path4b - / Users / myMac / NetBeansProjects / OCP /../../ xyz

     

path3c - / Users / myMac / NetBeansProjects / folder / abc

     

path4c - / Users / myMac / xyz

我完全迷失了,因为如何将两条绝对路径上的相对路径添加到我的计算机中的当前路径 - 它不应该被转换回原始的绝对路径吗?在理解这一切的纯粹逻辑和应用时我缺少什么?

(我理解代码是如何工作的,我不理解当两个不相关的路径被相对化时在现实生活中的逻辑背后和应用)

提前多多感谢。

3 个答案:

答案 0 :(得分:1)

如果您从/folder/abc开始,并且想要到达/xyz,则必须上升两级然后下降一级。上升两个级别意味着../..,下降一个意味着xyz。和../../xyz一起。{/ p>

以下解析相对路径../../xyz且起始路径为/folder/abc时会发生什么。

/folder/abc + ..  == /folder/abc/.. == /folder
/folder     + ..  == /folder/..     == /
/           + xyz == /xyz

要计算从某个路径A到不相关路径B的相对路径,您必须首先通过将A ..中的目录添加到一起来到达顶层。你到/。然后连接B。

答案 1 :(得分:1)

好的,由@JohnKugelman提供的解释澄清了它(我接受了这个解释。在发布这个时刻,我有11个声望点,而投票时我需要15个代表点。所以我现在不能对你的答案进行投票。希望稍后再做)。

基本上,我误解的主要原因是假设相对化与路径中的顶级文件夹相关 - 这并非完全不合逻辑,因为一旦两个路径中的顶级文件夹被相对化(两个路径的顶级文件夹之间的映射) (已知)然后可以确定从路径1中的任何文件夹到路径2中的任何文件夹的路线图。但这种理解是不正确的。

现在我明白要理解相对正确,需要牢记两点:

1)事实证明,relativize与路径的底层相关(不是我认为的顶层文件夹,所以在/ folder / abc的情况下,Java构造了与abc相关的相对路径);

2)如下面fmbesteiro的回答所述,它起到了FROM.relativize(TO)的作用;

因此当我这样做时:

path3 = Paths.get("/xyz");
path4 = Paths.get("/folder/abc");        
System.out.println(path3.relativize(path4));
System.out.println(path4.relativize(path3));

得到这个:

  

../文件夹/ ABC

     

../../ XYZ

在第一种情况下(从path3到path4),正如约翰库格曼写的那样,我必须上升一级并先下降两个级别到文件夹然后再到abc。在第二种情况下(从path4到path3)我必须上升两级,然后下降一级到xyz。

重新将相对化的绝对路径转换为AbsolutePath() - 我理解它是无意义的,没有意义,正如上面评论中提到的@EJP(如果你正在使用绝对路径)。因为你已经使用了绝对路径,你已经知道了它,为什么你会使用toAbsolutePath()然后 - 我试过它,因为我只是试验它并期望得到我曾经用于相对化的绝对路径。但是,如果我得到别的东西,这不是问题,因为我已经知道了绝对路径。

我还决定分享一些我用来理解相对化和规范化的代码 - 我希望它能帮助别人。

// prepared for Mac, needs to be changed for Windows 

import java.nio.file.Path;
import java.nio.file.Paths;

public class nio2test {

public static void main(String [] args) {

    System.out.println(Paths.get("/aaaa/bbbb/cccc/./dddd").normalize());
    //   /aaaa/bbbb/cccc/dddd

    System.out.println(Paths.get("/aaaa/bbbb/cccc/../dddd").normalize());
    //   /aaaa/bbbb/dddd

    // note one dot
    System.out.println(Paths.get("/aaaa/./bbbb/cccc/../dddd").normalize());
    //   /aaaa/bbbb/dddd

    System.out.println(Paths.get("/aaaa/bbbb/cccc/../../dddd").normalize());
    //   /aaaa/dddd
    // and so on

     // Note the comma within get - operating system-dependent path.separator is automatically inserted between elements
    System.out.println(Paths.get("/aaaa/.././bbbb","../cccc").normalize());
    //    /cccc


    System.out.println();
    Path currentPath4Java = Paths.get(".");
    System.out.println("currentPath4Java              - "+currentPath4Java);
    System.out.println("currentPath4Java ( relative ) - "+currentPath4Java.toAbsolutePath());
    System.out.println("currentPath4Java (normalised) - "+currentPath4Java.toAbsolutePath().normalize());

    System.out.println("this is the location in relation to which Java constructs all relative paths");

  }
}

答案 2 :(得分:0)

当您使用relativize时,您实际上试图找出从使用该方法的Path对象到您作为参数发送的路径的相对路径。基本上是:

from.relativize(to)

如果from是/a/b/c/a/d/e,那么从/a/b/c/a/d/e的相对路径为../../d/e

因此,在您的情况下,从/xyz转到/folder/abc需要../folder/abc并且从/folder/abc转到/xyz会相反要求相对路径为../../xyz

关于规范化方法,请考虑..,就好像它们是访问过的上一个文件夹一样,因此,对于使用的每个..,您必须返回一个文件夹。