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

在哪里使用java.nio.file.Path类的resolve()和relativize()方法?,java,path,resolve,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

输出

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);
我无法理解
resolve()
relativize()
是如何工作的

result1
result2
的实际用途是什么?

resolve()
:连接两个路径

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

输出说明:

result1:/Users/jack/text2.txt
:由于传递的是绝对路径,
resolve()
将传递的路径作为绝对路径返回

result2:../../text2.txt
:要从
/Users/jack/Documents/text1.txt”
访问
/Users/jack/text2.txt
,您需要向上两级,然后只需选择“text2.txt文件”

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

根据
此路径解析给定路径。
根据
此路径构建给定路径的相对路径。
这些是反向操作


路径解析(路径其他)

resolve()
的一般用例中,您希望返回一个新的
路径
对象,在该对象中,您将把这个
路径
对象加入到作为相对路径的
路径
参数,例如:

result1: /Users/jack/text2.txt
result2: ../../text2.txt
这里的
result1
将是
p1
p2
的路径连接,即:
/Users/jack/text1.txt

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

Path p1 = Paths.get("/Users/jack");
Path p2 = Paths.get("text1.txt");
Path result1 = p1.resolve(p2);
如果第二条路径是绝对路径,则将路径“附加”到另一条路径是没有意义的 因此javadoc认为在这种情况下,参数是作为
resolve()
的结果返回的:

如果另一个参数是绝对路径,则此方法非常简单 返回其他

路径相对化(路径其他)

该文件更具体地说:

此方法尝试构造一个相对路径,在解析时 根据
路径,生成一个与 给定路径

这意味着返回的
路径
路径
参数相对于
此路径的相对路径

例如,如果
路径是
“/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 result1 = p1.resolve(p2); 
。/../text2.txt
路径是预期的结果,因为根据
此路径(
/Users/jack/Documents/text1.txt
)解析生成的相对路径(
./../text2.txt
)生成的路径与给定路径(
/Users/jack/text2.txt
)位于同一文件中:


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

这些是使用relativize()的示例

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

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;
}
结果将是:
/test1/。/test2/test3

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

Path path1 = Paths.get("/test1/../test2");
Path path2 = Paths.get("test3");
System.out.println(path1.resolve(path2));
结果将是:

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));
-根据此路径解析给定路径。 如果另一个参数是一个绝对路径,那么这个方法很容易返回另一个参数

如果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("");
Path p3 = p1.resolve(p2); // returns /usr
-在此路径和给定路径之间构造相对路径。 这也意味着

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("/etc");
Path p3 = p1.resolve(p2); // returns /etc
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 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