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

考虑以下代码片段:

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个目录?

最佳答案

在回答的最后,我将回到您的示例。

relativize()的目的是在处理/访问文件和文件夹时独立于底层文件系统的结构。您不必知道您的应用程序文件夹位于哪个父文件夹/路径中。您只需要知道与应用程序相关的文件结构,就可以使用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的“相对路径”。

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

第二个是为其父文件夹/ 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)somename = ../../../../

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

现在您已经到达根,现在沿着第二条路径走下了阶梯。

所以输出

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

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

这种解释是否有助于您更好地理解relativize()的功能?

08-06 11:05