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

Where to use resolve() and relativize() method of java.nio.file.Path class?

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的实际用途是什么?

resolve(): 连接两条路径。

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

输出说明:

result1: /Users/jack/text2.txt: 因为你传入的是绝对路径,resolve() returns 传入的路径就好像是绝对路径一样

result2: ../../text2.txt:要从 /Users/jack/Documents/text1.txt" 到达 /Users/jack/text2.txt,您需要向上两层,然后只需 select `text2.txt 文件。

I cannot understand how resolve() and relativize() method works?

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


路径解析(路径其他)

resolve() 的一般用例中,您想要 return 一个新的 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 p1 = Paths.get("/Users/jack/Documents/text1.txt");
Path p2 = Paths.get("/Users/jack/text2.txt");
Path result1 = p1.resolve(p2); 

如果第二个是绝对值 Path,"append" 对另一个 Path 没有任何意义。
因此 javadoc 认为在这种情况下参数是 returned 作为 resolve() 的结果:

If the other parameter is an absolute path then this method trivially returns other.

路径相对化(其他路径)

文档更具体地说:

This method attempts to construct a relative path that when resolved against this path, yields a path that locates the same file as the given path.

表示returned PathPath参数相对于this 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() 方法的用法

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(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 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

Path::resolve - 根据此路径解析给定路径。

If the other parameter is an absolute path then this method trivially returns other.

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/etc");
Path p3 = p1.resolve(p2); // returns /etc

If other is an empty path then this method trivially returns this path.

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("");
Path p3 = p1.resolve(p2); // returns /usr

否则此方法将此路径视为目录并根据此路径解析给定路径。

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("local");
Path p3 = p1.resolve(p2); // returns /usr/local

Path::relativize - 构造此路径与给定路径之间的相对路径。

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/usr/local");
Path p3 = p1.relativize(p2); // returns local

这也意味着

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/usr/../usr/local");
Path p3 = p1.relativize(p2); // returns local

但是如果两条路径相等returns一个空路径

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/usr/../usr");
Path p3 = p1.relativize(p2); // returns empty path