2つのパスを結合する(Path.resolve,Path.resolveSibling)

Path クラスで用意されている resolve メソッドを使用すると、2 つの Path オブジェクトを結合した新しい Path オブジェクトを取得できます。また resolveSibling メソッドを使用すると対象のパスの親ディレクトリの下にもう一つのパスを結合することができます。ここでは Java を使って 2 つのパスを結合する方法について解説します。

(Last modified: )

パスとパスを結合する

Path クラスで用意されている resolve メソッドを使用すると、 Path オブジェクトが持つパスの情報に別の Path オブジェクトが持つパス情報を結合した新しい Path オブジェクトにして返してくれます。 resolve メソッドの書式は次の通りです。

Path resolve(Path other)

パラメータ:
other - このパスに対して解決するパス

戻り値:
結果のパス

1 番目の引数に結合する Path オブジェクトを指定します。メソッドを実行すると、対象の Path オブジェクトに引数で指定した Path オブジェクトのパス情報を結合した新しい Path オブジェクトを返します。

いくつか試してみます。元のパスが絶対パスで、引数に指定したパスが相対パスの場合です。

Path p1 = Paths.get("C:/data/image");
Path p2 = Paths.get("photo/profile.jpg");

Path p3 = p1.resolve(p2);
System.out.println(p3);  // C:\data\image\photo\profile.jpg

元のパスのあとに引数で指定したパスが結合されました。

次に元のパスが相対パスで、引数に指定したパスが相対パスの場合です。

Path p1 = Paths.get("data/image");
Path p2 = Paths.get("photo/profile.jpg");

Path p3 = p1.resolve(p2);
System.out.println(p3);  // data\image\photo\profile.jpg

この場合も元のパスのあとに引数で指定したパスが結合されました。

最後に元のパスが相対パスで、引数に指定したパスが絶対パスの場合です。

Path p1 = Paths.get("data/image");
Path p2 = Paths.get("C:/photo/profile.jpg");

Path p3 = p1.resolve(p2);
System.out.println(p3);  // C:/photo/profile.jpg

引数に指定したパスが絶対パスの場合は、引数に指定したパスがそのまま返されます。これは元のパスが絶対パスだった場合も同じです。

なお同じメソッド名で引数が文字列 resolve メソッドも用意されています。書式は次の通りです。

default Path resolve(String other)

パラメータ:
other - このパスに対して解決するパス文字列

戻り値:
結果のパス

例外:
InvalidPathException - パス文字列をPathに変換できない場合

使い方は引数が Path オブジェクトの場合と基本的に同じです。

Path p1 = Paths.get("C:/data/image");
Path p2 = p1.resolve("photo/profile.jpg");

System.out.println(p2);  // C:\data\image\photo\profile.jpg
サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample16-1.java という名前で保存します。

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

class JSample16_1{
  public static void main(String[] args){
    Path p1 = Paths.get("C:/data/image");
    Path p2 = Paths.get("photo/profile.jpg");
    Path p3 = p1.resolve(p2);

    System.out.println(p1);
    System.out.println(p2);
    System.out.println(p3);
  }
}	

コンパイルを行います。

javac -encoding UTF-8 JSample16_1.java

その後で、次のように実行してください。

java JSample16_1

パスとパスを結合する(1)

パスとパスを結合して新しいパスを取得することができました。

パスの親ディレクトリの下に別のパスを結合する

Path クラスで用意されている resolveSibling メソッドを使用すると、 Path オブジェクトが持つパスの情報の親ディレクトリに別の Path オブジェクトが持つパス情報を結合した新しい Path オブジェクトにして返してくれます。 resolveSibling メソッドの書式は次の通りです。

default Path resolveSibling(Path other)

パラメータ:
other - このパスの親に対して解決するパス

戻り値:
結果のパス

1 番目の引数に結合する Path オブジェクトを指定します。メソッドを実行すると、対象の Path オブジェクトの親ディレクトリに引数で指定した Path オブジェクトのパス情報を結合した新しい Path オブジェクトを返します。

いくつか試してみます。元のパスが絶対パスで親ディレクトリを持ち、引数に指定したパスが相対パスの場合です。

Path p1 = Paths.get("C:/data/image/river.jpg");
Path p2 = Paths.get("profile.jpg");

Path p3 = p1.resolveSibling(p2);
System.out.println(p3);  // C:\data\image\profile.jpg

元のパスの親ディレクトリのあとに引数で指定したパスが結合されました。

次に元のパスが相対パスで親ディレクトリを持ち、引数に指定したパスが相対パスの場合です。

Path p1 = Paths.get("image/river.jpg");
Path p2 = Paths.get("profile.jpg");

Path p3 = p1.resolveSibling(p2);
System.out.println(p3);  // image\profile.jpg

この場合も元のパスの親ディレクトリのあとに引数で指定したパスが結合されました。

次に元のパスに親ディレクトリがない場合です。

Path p1 = Paths.get("river.jpg");
Path p2 = Paths.get("profile.jpg");

Path p3 = p1.resolveSibling(p2);
System.out.println(p3);  // profile.jpg

元のパスに親ディレクトリがない場合は、引数に指定したパスがそのまま返されます。

最後に引数に指定したパスが絶対パスの場合です。

Path p1 = Paths.get("image/river.jpg");
Path p2 = Paths.get("C:/profile.jpg");

Path p3 = p1.resolveSibling(p2);
System.out.println(p3);  // C:\profile.jpg

引数に指定したパスが絶対パスの場合は、引数に指定したパスがそのまま返されます。

なお同じメソッド名で引数が文字列 resolveSibling? メソッドも用意されています。書式は次の通りです。

default Path resolveSibling(String other)

パラメータ:
other - このパスの親に対して解決するパス文字列

戻り値:
結果のパス

例外:
InvalidPathException - パス文字列をPathに変換できない場合

使い方は引数が Path オブジェクトの場合と基本的に同じです。

Path p1 = Paths.get("data/image");
Path p2 = p1.resolveSibling("profile.jpg");

System.out.println(p2);  // data\profile.jpg
サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample16-2.java という名前で保存します。

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

class JSample16_2{
  public static void main(String[] args){
    Path p1 = Paths.get("data/image/stone.jpg");
    Path p2 = Paths.get("grass.jpg");
    Path p3 = p1.resolveSibling(p2);

    System.out.println(p1);
    System.out.println(p2);
    System.out.println(p3);
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample16_2.java

その後で、次のように実行してください。

java JSample16_2

パスの親ディレクトリの下に別のパスを結合する(1)

パスの親ディレクトリとパスを結合して新しいパスを取得することができました。

-- --

Java を使って 2 つのパスを結合する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。