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

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); 

OUTPUT

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

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

result1result2的实际用途是什么?

这些是我的代码库中的代码片段,可帮助您了解resolve()方法的用法

 private File initUsersText() throws Exception { Path dir = testdir.getPath().toRealPath(); FS.ensureDirExists(dir.toFile()); File users = dir.resolve("users.txt").toFile(); writeUser( users ); return users; } private File initUsersText() throws Exception { Path dir = testdir.getPath().toRealPath(); FS.ensureDirExists(dir.toFile()); File users = dir.resolve("users.txt").toFile(); writeUser( users ); return users; } 

这些是使用relativize()的例子

 public ScopePath pathToClassName(Path file) { if (!isValidClass(file)) return null; Path relativePath = root.relativize(root.resolve(file)); String withoutExtension = removeExtension(relativePath.toString()); return new ScopePath(withoutExtension.replace(File.separator, ".")); } private String getRelativePath(Path p) { String relativePath = packageDir.relativize(p) .toString(); if (File.separator.equals("\\")) { relativePath = relativePath.replace("\\", "/"); } return relativePath; } 

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

Path resolve(Path)解析针对this路径的给定路径。
Path relativize(Path)构造给定路径相对this路径的相对路径。
这些是反向操作。


路径解析(路径其他)

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

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

这里result1将是p1p2的路径连接,即: /Users/jack/text1.txt

在您的示例中,传递给方法的参数不是相对Path而是绝对Path

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

将两个路径连接到绝对路径是没有意义的。
所以javadoc认为在这种情况下,参数是作为resolve()结果返回的:

如果另一个参数是绝对路径,则此方法通常会返回其他参数。

路径相对化(路径其他)

该文件更具体地说:

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

这意味着返回的PathPath参数相对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路径作为生成的相对路径( ../../text2.txt )针对this路径解析( /Users/jack/Documents/text1.txt )产生路径找到与给定路径相同的文件( /Users/jack/text2.txt ):

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

resolve() :连接两个路径。

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

输出说明:

result1: /Users/jack/text2.txt :因为你传入了一个绝对路径,如果它是一个绝对路径, resolve()将返回路径中传递的路径。

result2: ../../text2.txt :从/Users/jack/Documents/text1.txt"获取/Users/jack/Documents/text1.txt"你需要向上两级,然后选择`text2 .txt文件。

resolve(Path)是一种通过将现有路径连接到当前路径来创建新Path的方法。

 Path path1 = Paths.get("/test1/../test2"); Path path2 = Paths.get("test3"); System.out.println(path1.resolve(path2)); 

结果将是:/ /test1/../test2/test3

实际上,方法relativize(Path)用于构造从一个Path对象到另一个Path对象的相对路径:

 Path path1= Paths.get("E:\\test1"); Path path2= Paths.get("E:\\test2\\test3"); System.out.println(path1.relativize(path2)); System.out.println(path2.relativize(path1)); 

结果将是:

 ..\test2\test3 relative path from path1 to path2 ..\..\test1 relative path from path2 to path1