目次
Pathクラスは便利
Javaでファイルパスを扱う時に便利なPathクラス。例えば、ディレクトリバスを含むパス情報から、ファイル名を取り出すgetFileName()メソッドなど、ファイルパスを操作する時に便利なメソッドが一杯あります。
この記事では、JavaのPathクラスでよく使う便利なメソッドをサンプルコードを交えて解説します。
Pathのインスタンスを取得する方法
Pathを利用するには、Pathクラスのインスタンスを取得する必要があります。
インスタンスの取得には、FileSystemクラスのgetPathメソッドを使用します。getPathメソッドの引数に、取得したいディレクトリまたはファイルのパスを指定します。
import java.nio.file.FileSystems; import java.nio.file.Path; public class Main { public static void main(String[] args) { Path path = FileSystems.getDefault().getPath("/path/to/dir"); } }
getPathメソッドの引数を複数指定すると、渡した引数を連結させたパスのインスタンスが取得できます。
Path path = FileSystems.getDefault().getPath("/path/to/dir", "filename.txt");
FileSystem以外にも、PathsクラスのgetメソッドでもPathクラスのインスタンスが取得できます。
import java.nio.file.Path; import java.nio.file.Paths; public class SampleClass { public static void main(String[] args) { //PathsクラスでもPathのインスタンスを取得できる Path path = Paths.get("/path/to/dir", "filename.txt"); } }
絶対パスかどうかを調べる isAbsolute
isAbsolute()メソッドは、指定したパスが絶対パスかどうかを調べられます。絶対パスの場合、このメソッドはtrueを戻り値に返します。
以下のサンプルコードを見てみましょう。
Path path1 = FileSystems.getDefault().getPath("/path/to/dir", "filename.txt"); System.out.println(path1.isAbsolute()); Path path2 = FileSystems.getDefault().getPath("relative/dir", "filename.txt"); System.out.println(path2.isAbsolute());
コードを実行すると、次のような結果となり、絶対パスで指定している1つ目のパスは、isAbsoluteメソッドの結果がtrueになっています。
【実行結果】
true false
OSの環境によって、絶対パスの判定が異なる
isAbsolute()メソッドでの、絶対パス判定は、OSによって判定結果が異なります。
例えば、「C:¥Path¥To¥File.txt」のような絶対パスをWindows環境で実行すれば、isAbsoluteメソッドはtrueを返しますが、MacやLinux環境で実行すると結果はfalseになります。
これは、Pathクラスは実行するオペレーションシステムに依存するため、ルートパスはスラッシュ(/)で書くMacやLinuxの環境では、「C:」ドライブなどの概念がなく、相対パスと判断されるためです。
ファイル名を取得する getFileName
getFileName()メソッドは、ディレクトリバスを含むパスから、ファイル名を取得します。開発の現場では、パスからファイル名を取り出すシーンは意外と多くあり、覚えておくと便利です。
Path path = FileSystems.getDefault().getPath("/path/to/file.txt"); System.out.println(path.getFileName());
【実行結果】
File.txt
親ディレウトリを取得する getParent
getParent()メソッドは、指定したパスの親パスを返します。ディレクトリ+ファイル名のパスの場合、ディレクトリパスが帰り、ディレクトリのみを指定した場合、1つ上の階層のディレクトリパスが返ります。
ファイル名を含むパスを指定した場合
Path path = FileSystems.getDefault().getPath("/path/to/dir/File.txt"); System.out.println(path.getParent());
【実行結果】
/path/to/dir
ディレウトリパスのみを指定した場合
Path path = FileSystems.getDefault().getPath("/path/to/dir"); System.out.println(path.getParent());
【実行結果】
/path/to
ルートパスを取得する getRoot
getRoot()メソッドは、パスのルートを返します。
Path pathC = FileSystems.getDefault().getPath("C:/path/to/dir"); Path pathD = FileSystems.getDefault().getPath("D:/path/to/dir"); System.out.println(pathC.getRoot()); System.out.println(pathD.getRoot());
【実行結果】
C:¥ D:¥
ルートが分からない相対パスなどで、getRoot()メソッドを呼んだ場合は、結果はnullになります。
Path path = FileSystems.getDefault().getPath("relative/dir"); System.out.println(path.getRoot());
【実行結果】
null
2つのパスをつなげる resolveメソッド
resolve()メソッドは、引数で指定したパスをつなげて、新しいPathクラスのインスタンスを作成します。
次の例では、「/path/to/dir」と「sub_dir/file1.txt」のパスをつなげた新しいPathを作成しています。
Path path = FileSystems.getDefault().getPath("/path/to/dir"); Path resolvePath = path.resolve("sub_dir/file1.txt"); System.out.println(resolvePath);
【実行結果】
/path/to/dir/sub_dir/file1.txt
path.resolve() メソッドの引数には、Pathクラスのインスタンスを指定することもできるため、上のコードは、次のように書き直すこともできます。
Path path1 = FileSystems.getDefault().getPath("/path/to/dir"); Path path2 = FileSystems.getDefault().getPath("sub_dir/file1.txt"); Path resolvePath = path1.resolve(path2);
Pathクラスを活用してファイルパスを操作しよう
Javaでファイルパスを扱う時に便利なPathクラスを解説してきました。Pathクラスはファイル操作を行う時の基本となりますので、是非覚えておきましょう。
【関連記事】
▶【Java】初心者必見!ファイル読み込みの方法2選
引数に絶対パスを渡すと思った結果にならない
resolve()メソッドの引数に、絶対パスを指定すると、戻り値には引数で渡した絶対パスがそのまま返ってきます。間違って絶対パスを引数に渡すと、思い通りの結果になることがあるため、注意が必要です。