在哪里使用java.nio.file.Path类的resolve()和relivize()方法?

2022-09-01 19:57:22
Path p1 = Paths.get("/Users/jack/Documents/text1.txt");
Path p2 = Paths.get("/Users/jack/text2.txt");
Path result1 = p1.resolve(p2);
Path result2 = p1.relativize(p2);

System.out.println("result1: "+result1);
System.out.println("result2: "+result2);

输出

result1: /Users/jack/text2.txt
result2: ../../text2.txt

我无法理解如何工作?resolve()relativize()

和 的实际用途是什么?result1result2


答案 1

我无法理解 resolve() 和 relativize() 方法是如何工作的?

路径解析(路径)根据路径解析给定的路径。
Path relativize(Path) 构造给定路径相对于 path 的相对路径。
这些是反向操作。thisthis


路径解析(路径其他)

在 的一般用例中,您希望返回一个新对象,在该对象中,您将此对象连接到相对参数,例如:resolve()PathPathPathPath

Path p1 = Paths.get("/Users/jack");
Path p2 = Paths.get("text1.txt");
Path result1 = p1.resolve(p2);

下面将是 和 的路径连接,即: 。result1p1p2/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); 

如果第二个是绝对的,那么将 a“追加”到另一个是没有意义的。
因此,javadoc 认为在这种情况下,参数是作为以下结果返回的:PathPathresolve()

如果 other 参数是绝对路径,则此方法平凡地返回 other。

路径相对化(路径其他)

该文档更具体地说:

此方法尝试构造一个相对路径,当针对 path 进行解析时,将生成一个路径,该路径定位与给定路径相同的文件。this

这意味着返回的是参数相对于 的相对路径。PathPaththisPath

例如,如果 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../../text2.txtthis/Users/jack/Documents/text1.txt/Users/jack/text2.txt

Paths.of("/Users/jack/Documents/text1.txt").resolve("../../text2.txt")

returns -> /Users/jack/text2.txt

答案 2

resolve():连接两条路径。

relativize ():构造从文件系统中的一个位置到另一个位置的路径。

输出说明:

result1: /Users/jack/text2.txt:因为您在绝对路径中传递,因此返回在路径中传递的路径,如果它是绝对路径,则返回该路径。resolve()

result2: ../../text2.txt:要从中到达,您需要向上走两级,然后选择“text2.txt文件。/Users/jack/text2.txt/Users/jack/Documents/text1.txt"


推荐