我正在努力了解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()的功能?