1. 絶対パスから末尾のファイル名を取り出す
  2. ディレクトリを含まない単純なファイル名はそのまま返す
  3. 末尾が区切り文字で終わっていても末尾の名前を返す
  4. ネストの深い絶対パスでも末尾のファイル名だけを返す
  5. 拡張子のないファイル名でも末尾を返す
コース一覧
Java 中級:コレクション・Stream・例外処理
Path でファイルパスを扱う

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ5分

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/app

getFileName はいちばん末尾の名前を、getParent はそれを除いた親側を返します。ここで気をつけたいのは、どちらの戻り値も String ではなく Path だということです。文字列として扱いたいときは toString() を呼びます。

もうひとつの癖が、末尾の区切り文字を意味のあるものとして扱わない点です。/a/b/c/ と /a/b/c は同じパスと解釈されるので、末尾に / が付いていても getFileName が返すのは c です。ディレクトリを指す文字列とファイルを指す文字列が混ざって届く場面では、この性質に助けられます。

解説

Path は「どこを指すか」を表すだけで、ディスクには一切触りません。実際にそこにファイルがあるかを確かめたり、読み書きしたりするのは Files クラスの役目です。この役割分担が分かると、どちらのクラスを探せばいいかで迷わなくなります。

やってみよう

Solution.lastName(String pathStr) を完成させます。

  1. ファイルの先頭に import java.nio.file.Paths; を書く
  2. 受け取った文字列から Path を作る。split や lastIndexOf で自前で切り出してはいけません
  3. 末尾の名前を取り出し、String に変換して return する

lastName("/tmp/foo/bar.txt") は "bar.txt"、lastName("simple.txt") は "simple.txt" です。lastName("/a/b/c/") が "c" になるのは、さきほどの末尾の / の扱いがそのまま効いているからです。

要件

  1. ファイル先頭で import java.nio.file.Paths; を書くこと
  2. Paths.get(pathStr) を使って Path を生成すること (自前で String 操作しない)
  3. 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"

ヒント

実装本体は `return Paths.get(pathStr).getFileName().toString();` の 1 行で書けます

`getFileName()` の戻り値は `Path` 型なので、そのまま `return` するとコンパイルエラーになります。必ず `.toString()` を呼びましょう

`/a/b/c/` のように末尾が `/` で終わっていても、`Path` 側で吸収して `c` を返してくれます。自分で末尾の `/` を取り除く処理は不要です

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • BufferedReader と Stream API

    BufferedReader の発想を引き継ぎつつ、Files.lines で 1 行ずつ Stream<String> としてファイルを読み込み、Stream API で集計するモダンな書き方を学ぼう。

  • ファイルの存在確認と削除

    Files.exists / Files.delete などの基本 API を使い、一時ファイルを作って存在を確認し、削除してからもう一度確認するコードを書いてみよう。

  • ファイル I/O まとめクイズ

    ファイル I/O 章 (Files / Path / BufferedReader / try-with-resources) の総まとめ。書き込み API の使い分け、リソースの自動 close、文字コード、例外処理の組み合わせを 4 択クイズで再確認する。

  • extends で継承する

    Java の `extends` キーワードを使った継承の基本を学び、`Animal` を継承した `Dog` クラスを作って `Dog.bark()` の結果を返すコードを書いてみよう。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • ディレクトリファイルを整理するフォルダのこと。
  • 階層ネットワークを役割ごとに積み重ねた構造
  • 引数位置引数=順番で渡す。
  • 戻り値呼び出し元への返答を表す点線矢印
  • クラスデータと振る舞いを束ねる単位
main.java
学習モード
エディタを読み込んでいます

メモ

Path でファイルパスを扱う

⌘S で保存