在哪里使用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