1. 一時ファイルを作って exists/delete/exists の結果を文字列化する
コース一覧
Java 中級:コレクション・Stream・例外処理
ファイルの存在確認と削除

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分

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

消したはずのファイルを、もう一度消して落ちる

一時ファイルを片付ける処理を 2 回通ったり、前回の実行ですでに消えていたり。Files.delete は対象が無いと NoSuchFileException を投げるので、こういう場面であっさり止まります。「無ければ何もしなくていい」だけの処理なのに、例外が飛んでくるのは大げさに感じます。

ファイルの有無を調べるのは Files.exists です。Path を渡すと boolean が返ります。

Java

import java.nio.file.Files; import java.nio.file.Path; public class Demo { public static void main(String[] args) throws Exception { Path p = Path.of("work.tmp"); System.out.println(Files.exists(p)); // false Files.createFile(p); System.out.println(Files.exists(p)); // true } }

Files.createFile は空のファイルを作ります。こちらは逆に、すでに同じ名前があると FileAlreadyExistsException になります。作成も削除も、失敗しうる操作なので IOException の仲間を投げます。

先に exists で確かめても、確実にはならない

では if (Files.exists(p)) で囲めば安全かというと、実はそうとも言い切れません。exists が true を返した直後に、別のプロセスがそのファイルを消してしまえば、続く Files.delete はやはり失敗します。確認した時点と使う時点がずれることによる、古くから知られた問題です。

「無ければ無いでいい」だけなら、確認と削除を 1 つにまとめた Files.deleteIfExists を使うのが確実です。消せたら true、もともと無ければ false を返し、どちらでも例外は投げません。

  • Files.delete(p) — 必ずあるはずのものを消す。無ければ例外で気づける
  • Files.deleteIfExists(p) — 後片付け。無ければ静かに false

Java

Path p = Path.of("work.tmp"); System.out.println(Files.deleteIfExists(p)); // true (消せた) System.out.println(Files.deleteIfExists(p)); // false (もう無い)

どちらを使うかは、「そこに無いのは異常か、想定内か」で決めます。異常なら例外で止まったほうが原因に早くたどり着けます。

中身の残ったディレクトリは消せない

Files.delete はディレクトリにも使えますが、消せるのは空のときだけです。中にファイルが 1 つでも残っていれば DirectoryNotEmptyException になります。丸ごと消したいときは、Files.walk でたどってから深い側のものを先に削除する、という手順を自分で組みます。

解説

削除は取り消せません。Files.delete は OS の API をそのまま呼ぶので、ゴミ箱にも入らずに消えます。パスを組み立てて削除するコードを書くときは、まず消す予定のパスを出力するだけのモードを作り、目で確かめてから本番に回してください。

やってみよう

Solution.createAndCheck() を完成させます。引数はありません。

  1. メソッドに throws Exception を付ける
  2. 一時ファイルを作り、作った直後に存在するかどうかを boolean として受け取る
  3. そのファイルを削除する
  4. 削除後にもう一度確認し、「消えていること」を boolean として受け取る
  5. 2 つの結果から "created=true,deleted=true" の形の文字列を組み立てて return する

引っかかりやすいのは手順 4 です。削除後の Files.exists は false を返しますが、返したいのは「削除できたか」なので、その結果を反転させた値を使います。カンマの前後に余分な空白を入れないよう気をつけてください。

要件

  1. Files.createTempFile (もしくは Files.createFile + Paths.get) で一時ファイルを作ること
  2. Files.exists(p) を 2 回呼び、作った直後は true、Files.delete(p) 後は false になることを確認すること
  3. 最終的に "created=true,deleted=true" という形式の文字列を return すること

入出力例

createAndCheck() → "created=true,deleted=true"

ヒント

`Files.createTempFile("chot", ".tmp")` は OS の一時ディレクトリに一意なファイル名で空ファイルを作ってくれます

`Files.delete` はチェック例外 `IOException` を投げるので、メソッドに `throws Exception` (もしくは `throws IOException`) を付けます

削除されたかどうかは「削除後に存在しないこと」と同義なので、戻り値には `!Files.exists(p)` を `deleted` として入れます

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

関連レッスン

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

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

  • extends で継承する

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

  • BufferedReader と Stream API

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

  • Path でファイルパスを扱う

    java.nio.file.Path と Paths.get を使って、OS 非依存にファイルパスを組み立てたり分解したりする基本を学ぶ。

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

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

  • 処理計算や代入を表す長方形
  • プロセス実行中のプログラムのこと。
  • ディレクトリファイルを整理するフォルダのこと。
  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
  • 引数位置引数=順番で渡す。
  • メソッドクラスに属する関数
main.java
学習モード
エディタを読み込んでいます

メモ

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

⌘S で保存