コース一覧
    Java中級:例外処理とファイル入出力
    ファイルの存在確認と削除

    Java中級:例外処理とファイル入出力

    例外処理とファイル入出力を学び、失敗に対応しながらデータを読み書きするプログラムを作れるようにします。

    1
    例外処理
    01. try-catch で例外をつかむ5分
    02. 複数の catch ブロック5分
    03. throws と例外の伝播5分
    04. 独自の例外を作る5分
    05. try-with-resources5分
    06. finally ブロック5分
    07. 例外処理 まとめクイズ5分
    2
    ファイル I/O
    01. Files でファイルに書き込む5分
    02. ファイルを行単位で読む5分
    03. Path でファイルパスを扱う5分
    04. BufferedReader と Stream API5分
    05. ファイルの存在確認と削除5分
    06. ファイル I/O まとめクイズ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 すること

    ヒント

    `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 択クイズで再確認する。

    • BufferedReader と Stream API

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

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

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

    • ファイルを行単位で読む

      Java NIO.2 の `Files.readAllLines` と `Files.lines` を使い、ファイルの中身を 1 行ずつ `List<String>` として読み込む方法を学ぶ。

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

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

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

    メモ

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

    ⌘S で保存