1

我正在努力理解这种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 个目录?

4

1 回答 1

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() 的功能?

于 2017-03-04T12:46:46.320 回答