web-dev-qa-db-ja.com

Java.nio.file.Pathクラスのresolve()およびrelativize()メソッドを使用する場所

_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_の実際の使用法は何ですか?

10
sagar varsani

これらは、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;
}
5
Akshay Pethani

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は、Paththisに対する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
_
15
davidxxx

resolve():2つのパスを結合します。

relativize ():ファイルシステムのある場所から別の場所へのパスを作成します。

出力の説明:

_result1: /Users/jack/text2.txt_:絶対パスで渡したため、resolve()は、パスで渡されたものを絶対パスであるかのように返します。

_result2: ../../text2.txt_:_/Users/jack/text2.txt_から_/Users/jack/Documents/text1.txt"_に到達するには、2レベル上に移動して、 `text2.txtファイルを選択する必要があります。

5
QuakeCore

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
0
Imar