NIO.2:理解 relativize() 方法

NIO.2 : understanding the relativize() method

我很难理解 java.nio.file.Path.relativize() 方法。我也知道有人问过类似的 ,但答案并没有帮助我理解这个概念。

考虑以下代码片段:

Path path = Paths.get("/Users/somename/documents/Test/cat.html");
Path path2 = Paths.get("/documents/Test/cat.html");
System.out.println((path.relativize(path2))); //output: ../../../../../documents/Test/cat.html

有人可以逐步向我解释 relativize() 方法在此示例中的工作原理吗?为什么我需要上5个目录?

我会在回答的最后回到你的例子。

当涉及 adressing/accessing 文件和文件夹时,relativize() 的目的是独立于底层文件系统的结构。您不必知道您的应用程序文件夹位于哪个父级 folder/path 中。您只需要知道您的应用程序相关的文件结构,就可以使用 relativize() 来访问可能位于完全不同的文件夹中的所需文件。

举个例子:

假设您创建了一个应用程序。您的简单文件夹结构是

/myApp/app/app.java
/myApp/img/picture1.img
/myApp/sounds/ringtones/bell.mp3

启动应用你的工作路径是

<parent path>/myApp/app/

如果你现在想访问 picture1.img,你不必知道它的真实路径(从根目录到它的实际文件夹)是什么。只需使用 relativize() 提供的相对路径。它是这样的:

Path path = Paths.get("/myApp/app/app.java");
Path path2 = Paths.get("/myApp/img/picture1.img");
System.out.println((path.relativize(path2)));

这导致

../../img/picture1.img

这是从您的文件 app.java 到您的文件 picture1.img 的 "relative path"。

第一个路径符号代表文件app.java本身

second 用于其父文件夹 /app

您现在位于文件夹中

/myApp 

从你沿着这条路走下梯子的地方

/img/picture1.img

您可以使用上面显示的相对路径获取文件,您不必关心它的 realPath(),例如:

/Users/me/apps/myApp/img/picture1.img

只要您知道自己的文件夹结构并使用相对路径访问您的文件,您就不会在意您的应用程序文件夹所在的位置。

现在回到你的例子

relativize() 不知道从你的角度来看

<parent folder>/documents/Test/cat.html 

应该与

相同
/Users/somename/documents/Test/cat.html

对于 relativize() 它看起来像这样

/root/Users/somename/documents/Test/cat.html
/root/documents/Test/cat.html 

所以,从上层开始cat.html你去

1) cat.html = ../

2) 测试 = ../../

3) 文件 = ../../../

4) 某个名字 = ../../../../

5) 用户 = ../../../../../

现在您已经到达根目录,现在您沿着第二条路径下梯子。

所以输出

../../../../../documents/Test/cat.html

从 relativize() 的角度来看是完全正确的。

这个解释是否帮助您更好地理解 relativize() 的功能?