java.nio.file.Path class 的 resolve() 和 relativize() 方法在哪里使用?
Where to use resolve() and relativize() method of java.nio.file.Path class?
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
的实际用途是什么?
resolve()
: 连接两条路径。
relativize ()
: 构建从文件系统中的一个位置到另一个位置的路径。
输出说明:
result1: /Users/jack/text2.txt
: 因为你传入的是绝对路径,resolve()
returns 传入的路径就好像是绝对路径一样
result2: ../../text2.txt
:要从 /Users/jack/Documents/text1.txt"
到达 /Users/jack/text2.txt
,您需要向上两层,然后只需 select `text2.txt 文件。
I cannot understand how resolve() and relativize() method works?
Path resolve(Path)
根据 this
路径解析给定路径。
Path relativize(Path)
构造给定路径相对于 this
路径的相对路径。
这些是反向操作。
路径解析(路径其他)
在 resolve()
的一般用例中,您想要 return 一个新的 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
,"append" 对另一个 Path
没有任何意义。
因此 javadoc 认为在这种情况下参数是 returned 作为 resolve()
的结果:
If the other parameter is an absolute path then this method trivially
returns other.
路径相对化(其他路径)
文档更具体地说:
This method attempts to construct a relative path that when resolved
against this
path, yields a path that locates the same file as the
given path.
表示returned 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
这些是我的代码库中的代码片段,可帮助您理解 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;
}
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 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
Path::resolve - 根据此路径解析给定路径。
If the other parameter is an absolute path then this method trivially returns other.
Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/etc");
Path p3 = p1.resolve(p2); // returns /etc
If other is an empty path then this method trivially returns this path.
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
但是如果两条路径相等returns一个空路径
Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/usr/../usr");
Path p3 = p1.relativize(p2); // returns empty path
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
的实际用途是什么?
resolve()
: 连接两条路径。
relativize ()
: 构建从文件系统中的一个位置到另一个位置的路径。
输出说明:
result1: /Users/jack/text2.txt
: 因为你传入的是绝对路径,resolve()
returns 传入的路径就好像是绝对路径一样
result2: ../../text2.txt
:要从 /Users/jack/Documents/text1.txt"
到达 /Users/jack/text2.txt
,您需要向上两层,然后只需 select `text2.txt 文件。
I cannot understand how resolve() and relativize() method works?
Path resolve(Path)
根据 this
路径解析给定路径。
Path relativize(Path)
构造给定路径相对于 this
路径的相对路径。
这些是反向操作。
路径解析(路径其他)
在 resolve()
的一般用例中,您想要 return 一个新的 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
,"append" 对另一个 Path
没有任何意义。
因此 javadoc 认为在这种情况下参数是 returned 作为 resolve()
的结果:
If the other parameter is an absolute path then this method trivially returns other.
路径相对化(其他路径)
文档更具体地说:
This method attempts to construct a relative path that when resolved against
this
path, yields a path that locates the same file as the given path.
表示returned 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
这些是我的代码库中的代码片段,可帮助您理解 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;
}
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 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
Path::resolve - 根据此路径解析给定路径。
If the other parameter is an absolute path then this method trivially returns other.
Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/etc");
Path p3 = p1.resolve(p2); // returns /etc
If other is an empty path then this method trivially returns this path.
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
但是如果两条路径相等returns一个空路径
Path p1 = Paths.get("/usr");
Path p2 = Paths.get("/usr/../usr");
Path p3 = p1.relativize(p2); // returns empty path