Path でファイルパスを扱う
文字列でつないだら、スラッシュが 2 つになった
保存先のディレクトリとファイル名を dir + "/" + name でつなぐ。ほとんどの場合これで動いてしまうので、たちが悪いのです。dir の末尾にすでに / が付いていれば // になり、Windows では区切りが \ なので / と混ざり、name 側に階層が含まれていれば意図しない場所を指します。どれもファイルが見つからなくなってから気づきます。
Java にはパス専用の型があります。java.nio.file.Path です。文字列から作るには Paths.get に渡します。複数の文字列を渡せば、その環境に合った区切り文字でつないでくれます。
Java
import java.nio.file.Path;
import java.nio.file.Paths;
public class Demo {
public static void main(String[] args) {
Path dir = Paths.get("/var/log", "app");
Path full = dir.resolve("server.log");
System.out.println(dir); // /var/log/app
System.out.println(full); // /var/log/app/server.log
}
}つなぎ足すときに使うのが resolve です。dir.resolve("server.log") は、dir の下に名前を 1 つ足した新しい Path を返します。区切り文字が足りているかどうかを気にする必要はありません。Path は書き換わらない型なので、dir 自身は /var/log/app のままです。
resolve にはひとつ癖があります。引数が絶対パスだった場合は、左側を捨てて引数をそのまま返します。
Java
Path dir = Paths.get("/var/log/app");
System.out.println(dir.resolve("/etc/hosts")); // /etc/hosts利用者から受け取った値をそのまま足す場面では、この動きが意図と合っているか確かめてください。
末尾の / は、無いものとして扱われる
組み立てた Path は、部品に分けて取り出せます。よく使うのは次の 2 つです。
Java
Path full = Paths.get("/var/log/app/server.log");
System.out.println(full.getFileName()); // server.log
System.out.println(full.getParent()); // /var/log/appgetFileName はいちばん末尾の名前を、getParent はそれを除いた親側を返します。ここで気をつけたいのは、どちらの戻り値も String ではなく Path だということです。文字列として扱いたいときは toString() を呼びます。
もうひとつの癖が、末尾の区切り文字を意味のあるものとして扱わない点です。/a/b/c/ と /a/b/c は同じパスと解釈されるので、末尾に / が付いていても getFileName が返すのは c です。ディレクトリを指す文字列とファイルを指す文字列が混ざって届く場面では、この性質に助けられます。
Pathは「どこを指すか」を表すだけで、ディスクには一切触りません。実際にそこにファイルがあるかを確かめたり、読み書きしたりするのはFilesクラスの役目です。この役割分担が分かると、どちらのクラスを探せばいいかで迷わなくなります。
やってみよう
Solution.lastName(String pathStr) を完成させます。
- ファイルの先頭に
import java.nio.file.Paths;を書く - 受け取った文字列から
Pathを作る。splitやlastIndexOfで自前で切り出してはいけません - 末尾の名前を取り出し、
Stringに変換してreturnする
lastName("/tmp/foo/bar.txt") は "bar.txt"、lastName("simple.txt") は "simple.txt" です。lastName("/a/b/c/") が "c" になるのは、さきほどの末尾の / の扱いがそのまま効いているからです。
要件
- ファイル先頭で
import java.nio.file.Paths;を書くこと Paths.get(pathStr)を使ってPathを生成すること (自前でString操作しない)getFileName()で末尾を取得し、toString()でStringに変換してreturnすること
入出力例
lastName("/tmp/foo/bar.txt") → "bar.txt"
lastName("simple.txt") → "simple.txt"
lastName("/a/b/c/") → "c"
lastName("/var/log/app/2026/05/19/server.log") → "server.log"
lastName("/etc/hosts") → "hosts"