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()
的工作原理?
result1
和result2
的实际用途是什么?
答案 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
将是p1
和p2
的路径连接,即:/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
路径,产生一个路径,找到与该文件相同的文件 给定的路径。
这意味着返回的Path
是Path
参数相对于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 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 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