0

我正在玩 NIO Path 的东西,遇到了这个问题:

下面的代码片段会打印什么?

Path p1 = Paths.get("\\personal\\readme.txt");
Path p2 = Paths.get("\\index.html");
Path p3 = p1.relativize(p2);
System.out.println(p3);

答案是

..\..\index.html

但这会使整个路径:\personal\readme.txt\index.html

这对我来说似乎是无稽之谈,因为您不能将文件放在这样的文件中。你能?

如果 readme.txt 是一个目录而不是一个文件,我完全可以接受,但我很困惑为什么它允许这样的文件路径存在?

或者有什么奇怪的方法可以让你真正做到这一点?

4

2 回答 2

0

结果是..\..\index.html

从javadoc:

此方法尝试构造一个相对路径,当针对此路径解析时,会生成一个与给定路径定位相同文件的路径。例如,在 UNIX 上,如果此路径为“/a/b”且给定路径为“/a/b/c/d”,则生成的相对路径将为“c/d”。如果该路径和给定路径没有根组件,则可以构造相对路径。

这意味着您必须从该路径向上爬两个文件夹才能到达可以到达给定路径的路径,index.html.

请记住,这些都是路径,而不是实际的文件/文件描述符。

Path p1 = Paths.get("\\personal\\readme.txt");
Path p2 = Paths.get("\\personal\\index.html");
Path p3 = p1.relativize(p2);
System.out.println(p3);

prints ..\index.html,意思是从\\personal\\readme.txt,上一个然后访问index.html

于 2013-04-23T19:50:01.643 回答
0

ISO 和 Zip 文件(因此是 JAR/WAR/XUL/CHM...)都表示可以包含文件文件夹结构的文件。这些文件既可以作为文件处理,也可以作为文件夹处理;两者都是它们的合法用途。因此,这在语义上是有意义的:

Path p1 = Paths.get("\\personal\\photos.zip");
Path p2 = Paths.get("\\family\\me.png");
Path p3 = p1.relativize(p2);
System.out.println(p3);"

虽然我不知道 Java 中有任何以这种方式运行的实现,但它是 XUL 和 Windows 资源管理器中使用的语义。

于 2013-04-23T19:54:43.640 回答