我会在回答结束时回到你的例子。
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() 的功能?