我不明白 resolve() 和 relativize() 方法是如何工作的?
Path resolve(Path)
方法将给定的路径与当前路径进行解析。
Path relativize(Path)
方法构造给定路径相对于当前路径的相对路径。
这些方法是相反的操作。
Path resolve(Path other)
在通常使用 resolve()
的情况下,您想要返回一个新的 Path
对象,其中您将连接此 Path
对象和作为参数的相对路径,例如:
Path p1 = Paths.get("/Users/jack");
Path p2 = Paths.get("text1.txt");
Path result1 = p1.resolve(p2);
这里result1
将是p1
和p2
的路径拼接,即:/Users/jack/text1.txt
。
在您的示例中,传递给该方法的参数不是相对路径Path
,而是绝对路径:
Path p1 = Paths.get("/Users/jack/Documents/text1.txt");
Path p2 = Paths.get("/Users/jack/text2.txt");
Path result1 = p1.resolve(p2);
如果第二个参数是绝对路径,将一个Path
附加到另一个Path
就没有意义。
因此,文档中认为在这种情况下,该参数将作为resolve()
方法的结果返回:
如果其他参数是绝对路径,则此方法会直接返回其他路径。
Path relativize(Path other)
文档更具体地说明:
此方法尝试构造相对路径,使得与给定路径解析后定位的文件与this
路径相同。
这意味着返回的Path
是相对于this
Path
的Path
参数的相对路径。
例如,如果this
路径是"/a/b"
,给定的路径是"/a/b/c/d"
,则生成的相对路径将是"c/d"
。
我们将使用您提供的示例进行检查:
Path p1 = Paths.get("/Users/jack/Documents/text1.txt");
Path p2 = Paths.get("/Users/jack/text2.txt");
Path result2 = p1.relativize(p2);
// result2= ../../text2.txt
期望的结果是路径 ../../text2.txt
,因为对于路径 /Users/jack/Documents/text1.txt
而言,将相对路径 (../../text2.txt
) 解析得到的路径与 this
路径定位到同一文件,即给定路径为 /Users/jack/text2.txt
。
Paths.of("/Users/jack/Documents/text1.txt").resolve("../../text2.txt")
returns -> /Users/jack/text2.txt