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

sag*_*ani 10 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);
Run Code Online (Sandbox Code Playgroud)

OUTPUT

result1: /Users/jack/text2.txt
result2: ../../text2.txt
Run Code Online (Sandbox Code Playgroud)

我不知道如何resolve()relativize()作品?

什么是result1result2?的实际用途?

dav*_*xxx 15

我无法理解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);
Run Code Online (Sandbox Code Playgroud)

这里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); 
Run Code Online (Sandbox Code Playgroud)

Path如果第二个是绝对的,那么将"追加" 给另一个是没有意义的Path.
所以javadoc认为在这种情况下,参数是作为以下结果返回的resolve():

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

路径相对化(路径其他)

该文件更具体地说:

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

这意味着返回的Path是相对于Path参数 的相对路径this Path.

例如,如果thispath是"/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
Run Code Online (Sandbox Code Playgroud)

../../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
Run Code Online (Sandbox Code Playgroud)

  • 这应该被标记为正确答案。 (2认同)

Qua*_*ore 5

resolve():连接两个路径。

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

输出说明:

result1: /Users/jack/text2.txt:因为您输入的是绝对路径,resolve()所以如果它是绝对路径,则按原样返回通过的路径。

result2: ../../text2.txt:要进入该目录/Users/jack/text2.txt/Users/jack/Documents/text1.txt"您需要向上两个级别,然后只需选择`text2.txt文件。


Aks*_*ani 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;
}
Run Code Online (Sandbox Code Playgroud)

这些是使用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;
}
Run Code Online (Sandbox Code Playgroud)


fre*_*dev 5

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

如果 other 参数是绝对路径,则此方法通常会返回 other。

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/etc");
Path p3 = p1.resolve(p2); // returns /etc
Run Code Online (Sandbox Code Playgroud)

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

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("");
Path p3 = p1.resolve(p2); // returns /usr
Run Code Online (Sandbox Code Playgroud)

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

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("local");
Path p3 = p1.resolve(p2); // returns /usr/local
Run Code Online (Sandbox Code Playgroud)

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

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/usr/local");
Path p3 = p1.relativize(p2); // returns local
Run Code Online (Sandbox Code Playgroud)

这也意味着

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/usr/../usr/local");
Path p3 = p1.relativize(p2); // returns local
Run Code Online (Sandbox Code Playgroud)

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

Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/usr/../usr");
Path p3 = p1.relativize(p2); // returns empty path
Run Code Online (Sandbox Code Playgroud)