Pathオブジェクトを使ってファイルやディレクトリを表す

Files クラスで用意されているメソッド使ってファイルやディレクトリに関する操作を行う場合に、ファイルやディレクトリを表すのに Path オブジェクトを作成して使用します。ここでは Path オブジェクトを使ってファイルをディレクトリを表す方法について解説します。

(Last modified: )

Pathオブジェクトを作成する

Path オブジェクトの元になる Path はインターフェースです。 Path オブジェクトを作成するには java.nio.file.Paths クラスで用意されている get メソッドを使用して作成します。 get メソッドはクラスメソッドです。書式は次のとおりです。

public static Path get(String first, String... more)

パラメータ:
first - パス文字列またはパス文字列の最初の部分
more - 結合してパス文字列を形成するための追加文字列

戻り値:
結果のPath

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

ファイルやディレクトリを表すパスの情報を 1 つの文字列にまとめて指定するか、それともパスをセパレータ毎に要素として分け、各要素を引数に指定します。戻り値として引数に指定したファイルやディレクトリを表す Path オブジェクトを返します。

Windows 環境の場合ですが、例えば C:\code\java\file\report.txt というファイルを表す Path オブジェクトを取得するには次のように記述します。

Path p1 = Paths.get("C:\\code\\java\\file\\report.txt");
Path p2 = Paths.get("C:", "code", "java", "file", "report.txt");

※ 文字列の中でバックスラッシュ(\)は特別な意味を持ちますので、文字として \ を記述する場合はバックスラッシュを使って \\ のようにエスケープして記述します。

1 つの引数でファイルやディレクトリを表すパスを指定するか、パスをセパレータ( window の場合はバックスラッシュ)毎に要素に分け、各要素を引数に順に指定して Path オブジェクトを作成しました。

なお Windows 環境であってもセパレータとしてバックスラッシュ(\)の代わりにスラッシュ(/)を使って次のように記述することができます。

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

これ以降はスラッシュを使った方法で記述していきます。

先ほどはファイルを表す Path オブジェクトを作成しましたが、ディレクトリを表す Path オブジェクトも同じように記述することができます。

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

ディレクトリの場合、最後のセパレータがあってもなくても同じ扱いになるようです。

Path p = Paths.get("C:/code/java/file/");
サンプルコード

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

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

class JSample1_1{
  public static void main(String[] args){
    Path p1 = Paths.get("C:\\code\\java\\file\\report.txt");
    Path p2 = Paths.get("C:", "code", "java", "file", "report.txt");
    Path p3 = Paths.get("C:/code/java/file/report.txt");
    Path p4 = Paths.get("C:/code/java/file/");
    Path p5 = Paths.get("C:/code/java/file");

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

コンパイルを行います。

javac -encoding UTF-8 JSample1_1.java

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

java JSample1_1

Pathオブジェクトを作成する(1)

Path オブジェクトの対象となるファイルの記述方法として 3 通りの方法で試してみました。いずれの場合も同じになります。またディレクトリを対象とした場合に最後のセパレータがある場合とない場合でも試してみました。どちらも同じ結果となりました。

Pathオブジェクトを作成する(Java 11以降)

Java 11 以降であれば Path オブジェクトを作成するのに Path クラスで用意されている of メソッドを使用することもできます。 of メソッドはクラスメソッドです。書式は次のとおりです。

static Path of(String first, String... more)

パラメータ:
first - パス文字列またはパス文字列の最初の部分
more - 結合してパス文字列を形成するための追加文字列

戻り値:
結果のPath

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

使い方は Paths.get メソッドと基本的に同じです。 Windows 環境の場合ですが、例えば C:\code\java\file\report.txt というファイルを表す Path オブジェクトを取得するには次のように記述します。

Path p1 = Path.of("C:\\code\\java\\file\\report.txt");
Path p2 = Path.of("C:", "code", "java", "file", "report.txt");

Java 11 以降であれば Path.of メソッドを使用されてください。

サンプルコード

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

import java.nio.file.Path;

class JSample1_1{
  public static void main(String[] args){
    Path p1 = Path.of("C:\\code\\java\\file\\report.txt");
    Path p2 = Path.of("C:", "code", "java", "file", "report.txt");
    Path p3 = Path.of("C:/code/java/file/report.txt");

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

コンパイルを行います。

javac -encoding UTF-8 JSample1_2.java

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

java JSample1_2

Pathオブジェクトを作成する(Java 11以降)(1)

Path.of メソッドを使って Path オブジェクトを取得してみました。

Pathオブジェクトを作成する(FileSystems)

Paths.get メソッドや Path.of メソッドは内部的には FileSystem.getPath メソッドを呼び出しています。 FileSystem.getPath メソッドを使って Path オブジェクトを作成するには次のように行います。

FileSystem fs = FileSystems.getDefault();
Path p1 = fs.getPath("C:\\code\\java\\file\\report.txt");
Path p2 = fs.getPath("C:", "code", "java", "file", "report.txt");

FileSystems クラスの getDefault メソッドを使ってデフォルトのファイルシステムオブジェクトを取得します。そして FileSystem クラスの getPath メソッドを使って Path オブジェクトを取得します。

public abstract Path getPath(String first, String... more)

パラメータ:
first - パス文字列またはパス文字列の最初の部分
more - 結合してパス文字列を形成するための追加文字列

戻り値:
結果のPath

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

普段は Paths.get メソッドまたは Path.of メソッドを使用しておけばいいかと思いますが、一応こちらの方法も覚えておかれてください。

絶対パスと相対パス

ファイルのパスは絶対パスと相対パスで指定することができます。絶対パスとは Windows であればルートコンポーネントの C:\ や D:\ などのようにドライブ名から対象のディレクトリやファイルまでのパスをすべて記述したものです。例えば C:\code\java\file\report.txt への Path オブジェクトは絶対パスで記述すると次のようにようになります。

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

それに対して相対パスとはカレントディレクトリから対象のディレクトリやファイルへの相対的なパスを記述します。例えばカレントディレクトリが C:\code\java\file の場合に C:\code\java\file\report.txt への Path オブジェクトは相対パスで記述すると次のようにようになります。

Path p = Paths.get("report.txt");

もしカレントディレクトリが C:\code\java の場合に C:\code\java\file\report.txt への Path オブジェクトは相対パスで記述すると次のようにようになります。

Path p = Paths.get("file/report.txt");

※ コマンドプロンプトからプログラムを実行している場合、プログラムを実行しているディレクトリがカレントディレクトリになります。

Path オブジェクトを作成するときは絶対パスでも相対パスでもどちらの方式で記述しても構いません。ただし相対パスで記述する場合は、同じように記述した場合でもカレントディレクトリが異なっていれば Path オブジェクトが表すファイルやディレクトリは異なりますので注意してください。

なお相対パスで Path オブジェクトを作成した場合、絶対パスに変換されてパス情報を持っているわけではなく、あくまで相対パスの形でパス情報を持っています。次のサンプルを見てください。

Path p = Paths.get("file/report.txt");
System.out.println(p.toString());  // file\report.txt

相対パスで作成した Path オブジェクトは、相対パスの情報だけを持っていることが確認できます。

-- --

Path オブジェクトを使ってファイルをディレクトリを表す方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。