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

时间:2018-05-27 12:02:00

标签: java path resolve

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

5 个答案:

答案 0 :(得分:13)

  

我无法理解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 p1 = Paths.get("/Users/jack/Documents/text1.txt");
Path p2 = Paths.get("/Users/jack/text2.txt");
Path result1 = p1.resolve(p2); 

"追加"没有任何意义。如果第二个是绝对Path,则Path到另一个{。}} 所以javadoc认为在这种情况下,参数作为resolve()

的结果返回
  

如果另一个参数是绝对路径,那么这个方法很简单   返回其他。

路径相对化(路径其他)

该文件更具体地说:

  

此方法尝试构建解析后的相对路径   对this路径,产生一个路径,找到与该文件相同的文件   给定的路径。

这意味着返回的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

答案 1 :(得分:5)

这些是我的代码库中的代码片段,可帮助您了解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;
}

答案 2 :(得分:4)

resolve():加入两条路径。

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

输出说明:

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

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

答案 3 :(得分:3)

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

<块引用>

如果另一个参数是一个绝对路径,那么这个方法会简单地返回另一个。

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/etc");
Path p3 = p1.resolve(p2); // returns /etc
<块引用>

如果 other 是空路径,则此方法简单地返回此路径。

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

但是如果两条路径相等则返回一个空路径

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

答案 4 :(得分:0)

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对象的相对路径:

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