_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()メソッドの使用を理解するのに役立つ、私のコードベースのコードスニペットです。
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()およびrelativize()メソッドの仕組みを理解できませんか?
Path resolve(Path)
は、与えられたパスをthis
パスに対して解決します。Path relativize(Path)
this
pathに対して指定されたパスの相対パスを構築します。
これらは逆の操作です。
Path resolve(Path other)
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);
_
2番目が絶対Path
である場合、別のPath
に「追加」することは意味がありません。
したがって、javadocは、この場合、パラメーターはresolve()
の結果として返されると見なします。
他のパラメーターが絶対パスの場合、このメソッドは単純にotherを返します。
Path relativize(Path other)
ドキュメントはより具体的に言う:
このメソッドは、
this
パスに対して解決されたときに、指定されたパスと同じファイルを見つけるパスを生成する相対パスを作成しようとします。
つまり、返されるPath
は、Path
this
に対するPath
パラメーターの相対パスです。
たとえば、this
pathが_"/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
_)がthis
パス(_../../text2.txt
_)に対して解決されるため、指定されたものと同じファイルを見つけるパスが生成されるため、結果として_/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()
:2つのパスを結合します。
relativize ()
:ファイルシステムのある場所から別の場所へのパスを作成します。
出力の説明:
_result1: /Users/jack/text2.txt
_:絶対パスで渡したため、resolve()
は、パスで渡されたものを絶対パスであるかのように返します。
_result2: ../../text2.txt
_:_/Users/jack/text2.txt
_から_/Users/jack/Documents/text1.txt"
_に到達するには、2レベル上に移動して、 `text2.txtファイルを選択する必要があります。
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