在准备java 7认证考试时,我必须开始密切关注Path.relativize()
方法。虽然从表面上说它的目的似乎是直截了当的,表达了一条相对于另一条路径的路径,但我发现它的实现违背了我对文件系统的所有理解,即在Windows或Linux / Unix上。
请考虑以下事项:
// Case 1
System.out.println(Paths.get("c:\\folder1\\folder2").relativize(Paths.get("c:\\file.txt")));
// Case 2
System.out.println(Paths.get("c:\\folder1\\folder2\\other-file.txt").relativize(Paths.get("c:\\file.txt")));
// Case 3
System.out.println(Paths.get("c:\\folder1\\..\\.\\folder1\\..\\.\\folder1\\..\\.\\folder1\\..").relativize(Paths.get("c:\\file.txt")));
我得到的输出是:
..\..\file.txt
..\..\..\file.txt
..\..\..\..\..\..\..\..\..\..\..\file.txt
案例1说明了在给定文件和文件夹的绝对路径的情况下,可以期望该功能的直接使用,即,相对于文件夹找到文件的路径。好吧,这给了我一些我可以在Windows的cmd窗口中键入的内容,并且可以正确找到我的文件。
案例2,正如其他StackOverflow问题中所讨论的那样,强调了该方法无法区分文件名和文件夹名的事实(文件夹可以在其名称中包含。,文件可以没有)。好吧,对我而言,这应该意味着该方法应该带有警告:“使用风险自负,如果提供叶子是文件的路径,则相对化的结果将无法在文件系统中起作用”。或者,如果是,是哪个文件系统?
案例3对我来说是无稽之谈。该方法甚至没有考虑“。”的含义。和源代码路径中的“..”,但在结果中愉快地使用“..”作为在源文件夹中上升级别的方法。这在我尚未遇到的理论文件系统中可能有意义,但在Windows,Linux或Unix中,结果无法使用。 “.. \ .. \ .. \ .. \ .. \ .. \ .. \ .. \ .. \ .. \ .. \ file.txt”当然不会指向file.txt相对于尽管表达为“c:\ folder1 \ .. \。\ folder1 \ .. \。\ folder1 \ .. \。\ folder1 \ ..”的路径确实指向“c:\”。
感谢您的到目前为止。问题:Path.relativize()方法有什么可能的用途,考虑到它的结果只会在一小部分案例中产生现实意义?
答案 0 :(得分:1)
你的表达
Paths.get("c:\\folder1\\..\\.\\folder1\\..\\.\\folder1\\..\\.\\folder1\\..")
标准化后,实际上只是c:\
。
如果您然后将c:\file.txt
与该路径相对应,那么您将获得一条引导您前往的相对路径。从c:\
开始,该相对路径为file.txt
。
结果
..\..\..\..\..\..\..\..\..\..\..\file.txt
完全等同于file.txt
。归一化时,前导..
将被丢弃。我同意它并不漂亮,但这只是一个实现细节。