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() 的功能?
我很难理解 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() 的功能?