Pathオブジェクトに含まれるパスの各要素を取得する

Path オブジェクトが持つパス情報にはルートコンポーネントから途中のディレクトリを表す各要素、そしてパスの最後に記述されているファイル名またはディレクトリ名などの情報が含まれています。ここでは Path オブジェクトに含まれるパスの各要素の情報を取得する方法について解説します。

(Last modified: )

パス情報から取得できる情報について

先に Path オブジェクトが持つパス情報からどの部分の情報を取得できるのかについて簡単に解説します。まず次のように絶対パスを使って Path オブジェクトを作成した場合です。

Path p1 = Paths.get("C:/code/java/file/doc/report.txt");
Path p2 = Paths.get("D:/data/picture");

Path クラスの getFileName メソッドを使用すると、パスの最後の要素であるファイルやディレクトリの名前を取得できます。 p1 の場合にはファイル名である report.txt 、 p2 の場合には picture を取得できます。(実際にはこれらの情報だけを持つ Path オブジェクトを取得します)。

Path クラスの getParent メソッドを使用すると、パスの最後の要素であるファイルやディレクトリの親ディレクトリの名前を取得できます。 p1 の場合には C:\code\java\file\doc 、 p2 の場合には D:\data を取得できます。

Path クラスの getRoot メソッドを使用すると、パスのルートコンポーネントを取得できます。ルートコンポーネントは Windows 環境の場合はドライブの部分です。 p1 の場合にはC:\ 、 p2 の場合には D:\ を取得できます。

Path クラスの getNameCount メソッドを使用すると、パスの中のルートコンポーネント以外の要素の数を取得できます。 p1 の場合には code 、 java 、 file 、 doc 、 report.txt という要素が含まれるので 5 が返されます。 p2 の場合は 2 が返されます。

Path クラスの getName メソッドを使用すると、パスの中の指定したインデックスの要素を取得できます。 p1 の場合には インデックス 0 は code 、インデックス 1 は java です。

次に相対を使って Path オブジェクトを作成した場合です。

Path p1 = Paths.get("file/doc/report.txt");
Path p2 = Paths.get("my.jpg");

相対パスの場合、相対パスだけの情報を元に各メソッドが値を返します。絶対パスに変換された上で値が返されるわけではない点に注意してください。

Path クラスの getFileName メソッドでは同じようにファイル名やディレクトリ名を取得できます。 getParent メソッドでは p1 の場合は file\doc を取得しますが p2 のように親ディレクトリの要素が存在しない場合は null を返します。また相対パスではルートコンポーネントが含まれないので getRoot メソッドは常に null となります。

getNameCount メソッドおよび getName メソッドは相対パスに含まれる要素の分だけ取得します。例えば p1 の場合は getNameCount メソッドは 3 を返し、インデックス 0 の要素は file です。

それでは各メソッドについて詳しく見ていきます。

ファイルまたはディレクトリの名前を取得する(Path.getFileName)

Path オブジェクトが表すファイルまたはディレクトリの名前を取得するには Path クラスで用意されている getFileName メソッドを使用します。書式は次のとおりです。

Path getFileName()

戻り値:
ファイルまたはディレクトリの名前を表すパス。このパスに要素が含まれていない場合はnull

メソッドを実行すると Path オブジェクトのファイルまたはディレクトリの名前を表す Path オブジェクトを返します。ここで名前とはパスの最後の要素であるファイルやディレクトリの名前のことです。

次のサンプルを見てください。

Path p1 = Paths.get("C:/code/java/file/doc/report.txt");
Path p2 = Paths.get("D:/image/picture");
Path p3 = Paths.get("file/backup.bat");

System.out.println(p1.getFileName());  // report.txt
System.out.println(p2.getFileName());  // picture
System.out.println(p3.getFileName());  // backup.bat

それぞれの Path オブジェクトの名前部分を取得することができました。

親ディレクトリを取得する(Path.getParent)

Path オブジェクトが表すファイルまたはディレクトリの親ディレクトリを取得するには Path クラスで用意されている getParent メソッドを使用します。書式は次のとおりです。

Path getParent()

戻り値:
そのパスの親を表すパス

メソッドを実行すると Path オブジェクトが表すファイルまたはディレクトリの親ディレクトリのパスを取得します。

次のサンプルを見てください。

Path p1 = Paths.get("C:/code/java/file/doc/report.txt");
Path p2 = Paths.get("D:/image/picture");
Path p3 = Paths.get("file/backup.bat");
Path p4 = Paths.get("profile.jpg");

System.out.println(p1.getParent());  // C:\code\java\file\doc
System.out.println(p2.getParent());  // D:\image
System.out.println(p3.getParent());  // file
System.out.println(p4.getParent());  // null

それぞれの Path オブジェクトのファイル名またはディレクトリ名の親ディレクトリを取得することができました。 p4 のように親ディレクトリが存在しない場合には null が返されます。

ルートコンポーネントを取得する(Path.getRoot)

Path オブジェクトが持つパスの情報からルートコンポーネントを取得するには Path クラスで用意されている getRoot メソッドを使用します。書式は次のとおりです。

Path getRoot()

戻り値:
このパスのルート・コンポーネントを表すパス、またはnull

メソッドを実行すると Path オブジェクトが持つパスの情報からルートコンポーネントを取得します。

次のサンプルを見てください。

Path p1 = Paths.get("C:/code/java/file/doc/report.txt");
Path p2 = Paths.get("D:/image/picture");
Path p3 = Paths.get("file/backup.bat");

System.out.println(p1.getRoot());  // C:\
System.out.println(p2.getRoot());  // D:\
System.out.println(p3.getRoot());  // null

それぞれの Path オブジェクトのルートコンポーネントを取得することができました。 p3 のように相対パスの場合は null が返されます。

パスに含まれる要素の数を取得する(Path.getNameCount)

Path オブジェクトが持つパスの情報に含まれる要素の数を取得するには Path クラスで用意されている getNameCount メソッドを使用します。書式は次のとおりです。

int getNameCount()

戻り値:
パス内の要素の数。このパスがルート・コンポーネントのみを表す場合は0

メソッドを実行すると Path オブジェクトが持つパスの情報に含まれる要素の数を取得します。取得する要素の数にはルートコンポーネントは含まれません。

次のサンプルを見てください。

Path p1 = Paths.get("C:/code/java/file/doc/report.txt");
Path p2 = Paths.get("D:/image/picture");
Path p3 = Paths.get("file/backup.bat");

System.out.println(p1.getNameCount());  // 5
System.out.println(p2.getNameCount());  // 2
System.out.println(p3.getNameCount());  // 2

それぞれの Path オブジェクトに含まれる要素の数を取得することができました。例えば p2 の場合であれば、要素は image と picture の 2 つです。

インデックスを指定して要素を取得する(Path.getName)

Path オブジェクトが持つパスの情報に含まれる要素の中でインデックスを指定して要素を取得するには Path クラスで用意されている getName メソッドを使用します。書式は次のとおりです。

Path getName(int index)

パラメータ:
index - 要素のインデックス

戻り値:
名前要素

例外:
IllegalArgumentException - indexが負の値である場合、indexが要素数と等しいか、それよりも大きい場合、またはこのパスに名前要素が含まれていない場合

1 番目の引数に取得する要素のインデックスを指定します。インデックスは 0 から始まります。戻り値として指定したインデックスの要素を取得します。

次のサンプルを見てください。

Path p = Paths.get("C:/code/java/file/doc/report.txt");

System.out.println(p.getName(0));  // code
System.out.println(p.getName(1));  // java
System.out.println(p.getName(2));  // file
System.out.println(p.getName(3));  // doc
System.out.println(p.getName(4));  // report.txt

それぞれの Path オブジェクトに含まれる要素をインデックスを指定して取得することができました。

開始インデックスから終了インデックスまでの要素が含まれるパスを取得する(Path.subpath)

Path オブジェクトが持つパスの情報に含まれる要素の中で開始インデックスと終了インデックスの間にある要素が含まれるパスを取得するには Path クラスで用意されている subpath メソッドを使用します。書式は次のとおりです。

Path subpath(int beginIndex, int endIndex)

パラメータ:
beginIndex - 最初の要素のインデックス(これを含む)
endIndex - 最後の要素のインデックス(これを含まない)

戻り値:
このPathの名前要素のサブシーケンスである新しいPathオブジェクト

例外:
IllegalArgumentException - beginIndexが負の値である場合、またはそれが要素数に等しいか、それよりも大きい場合。 endIndexがbeginIndexに等しいか、それよりも小さい場合、またはそれが要素数よりも大きい場合。

1 番目の引数に指定した開始インデックスから 2 番目の引数に指定した終了インデックスの前までの要素が含まれるパスを戻り値として取得します。終了インデックスの要素は含まれない点に注意してください。

次のサンプルを見てください。

Path p = Paths.get("C:/code/java/file/doc/report.txt");

System.out.println(p.subpath(0, 2));  // code\java
System.out.println(p.subpath(1, 4));  // java\file\doc

開始インデックスから終了インデックスの一つ前までの要素を含むパスを取得することができました。

サンプルコード

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

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

class JSample14_1{
  public static void main(String[] args){
    Path p1 = Paths.get("C:/code/java/file/doc/report.txt");
    Path p2 = Paths.get("D:/image/picture");
    Path p3 = Paths.get("file/backup.bat");
    Path p4 = Paths.get("profile.jpg");
    Path p5 = Paths.get("C:/");

    dispPathInfo(p1);
    dispPathInfo(p2);
    dispPathInfo(p3);
    dispPathInfo(p4);
    dispPathInfo(p5);
  }

  private static void dispPathInfo(Path p){
    System.out.println("Path:" + p);
    System.out.println("Name:" + p.getFileName());
    System.out.println("Parent Directory:" + p.getParent());
    System.out.println("Root Component:" + p.getRoot());
    System.out.println("Name Count:" + p.getNameCount());
    StringBuilder sb = new StringBuilder();
    for (int i = 0 ; i < p.getNameCount() ; i++){
      sb.append("[");
      sb.append(p.getName(i));
      sb.append("]");
    }
    System.out.println(sb);
    System.out.println("-- --");
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample14_1.java

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

java JSample14_1

Pathオブジェクトに含まれるパスの各要素を取得する(1)

Path オブジェクトに含まれる各要素を取得し画面に表示しました。

-- --

Path オブジェクトに含まれるパスの各要素の情報を取得する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

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