page2
@page2

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

JAVA Pathクラスresolve()メソッドの挙動について

Q&A

Closed

解決したいこと

Pathクラスのresolveメソッドの挙動についてご教授いただけないでしょうか?

発生している問題

Pathクラスのresolve(Path other)メソッドについてです。
APIでは、
引数に絶対パス(ルートからの階層構造)を渡すと引き数がそのまま返されるとなっています。

以下コードをご参照下さい。
PathオブジェクトのotherPathをisAbsolute()で確認した上で、resolve()に渡しています。

結果は、

otherPathは絶対パス? false
path1.resolve(otherPath)の結果は?C:\playground\test.txt

となりました。

otherPathは絶対パスではないのですが、resolveメソッドの引数に渡すとotherPathがそのまま返ってきます。
この挙動はどういうことなのでしょうか?

サンプルコード

import java.nio.file.Path;
import java.nio.file.Paths;

public class Test {

	public static void main(String[] args) {
		String source = "C:\\Users\\user\\Desktop";
		String other="\\playground\\test.txt";
		
		Path sourcePath= Paths.get(source);
		Path otherPath= Paths.get(other);
		
		Path resolvePath=sourcePath.resolve(otherPath);
		
		System.out.println("otherPathは絶対パス? "+otherPath.isAbsolute());
		System.out.println("path1.resolve(otherPath)の結果は?"+resolvePath);
		
	}

}

0

1Answer

otherの先頭の \\ がトップディレクトリと解釈され、ドライブレターだけ付け加えられたようですね。

String other="playground\\test.txt";

に変更したら、

otherPathは絶対パス? false
path1.resolve(otherPath)の結果は?C:\Users\user\Desktop\playground\test.txt

と表示されました。

0Like

Comments

  1. @page2

    Questioner

    @shiracamus様

    早速に、教えて頂きありがとうございます!
    一点、わからないのですが、

    otherPath.isAbsolute()

    でfalseが返ってきております。
    ということは、
    otherPathは絶対パスではない
    となり、resolve()では、soucePathとotherPathが結合されたパスが戻るのでは?と思うのですが、
    結果としては、resolve()は引き数のotherPathを絶対パスと判断しています。
    isAbsolute()とresolve()の絶対パスの基準が違うのでしょうか?

  2. resolve() で sourcePath からドライブレターの C: が結合されています。
    other は \\ で始まるトップディレクトリ配下なので、sourcePath のディレクトリ部分は結合されません。
    other の先頭の \\ を削除すれば、sourcePathのディレクトリ部分も結合されます。

    othersを C:\\playground\\test.txt にしたら isAbsolute() が true になりました。
    絶対パスにはドライブレターが必要なようです。
  3. @page2

    Questioner

    @Shiracamus様

    ご教授頂きありがとうございます。
    なるほどです!
    >\\ で始まるトップディレクトリ配下なので
    この部分の知識が欠落しておりました。スッキリいたしました!
    コメント頂き、誠にありがとうございました!

Your answer might help someone💌