コース一覧
    Java中級:例外処理とファイル入出力
    Files でファイルに書き込む

    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分

    Files でファイルに書き込む

    書いたはずのファイルが、開いたら空だった

    FileWriter に文字列を渡して write を呼び、プログラムを終わらせて、できたファイルを開いたら中身が空。ファイル書き込みで最初に出会うのがこれです。書いた内容はいったん手元にため込まれ、close() を呼んだ時点で初めてディスクへ流れるので、閉じ忘れた分がまるごと消えます。

    いまの Java なら、この手順ごと java.nio.file.Files に任せられます。writeString は、開く、書く、閉じるまでを 1 行の中で終わらせてくれます。

    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("memo.txt");
            Files.writeString(p, "今日の作業メモ");
        }
    }

    Path は「どのファイルか」を表す型です。読み返すときは対になる Files.readString(p) を呼べば、中身がまるごと String で返ってきます。どちらも失敗しうる操作なので IOException を投げます。throws を付けるか try で受けるかは、これまでの例外処理の回と同じ判断です。

    保存先を決め打ちにすると、2 人同時に走った瞬間に壊れる

    Path.of("memo.txt") のように名前を固定すると、同じ処理が同時に 2 つ動いたときに同じファイルを奪い合います。テストを並列で回した途端に落ちるのは、たいていこれが原因です。

    一時的な置き場が欲しいだけなら Files.createTempFile を使います。OS の一時ディレクトリに、他とぶつからない名前でファイルを作り、その Path を返してくれます。

    Java

    Path tmp = Files.createTempFile("report", ".csv");
    System.out.println(tmp);   // 例 /tmp/report8471250.csv
    Files.delete(tmp);         // 使い終わったら消す

    第 1 引数が名前の先頭、第 2 引数が拡張子で、その間に重複しない文字列が入ります。作りっぱなしにすると一時ディレクトリにごみがたまるので、Files.delete で片付けるところまでを一組と考えてください。

    Windows で書いたファイルが、Linux で文字化けする

    古い FileWriter は、動いている環境の既定の文字コードで書き出します。Windows で作ったファイルには Shift_JIS が、Linux では UTF-8 が使われるので、日本語を含むファイルを受け渡した瞬間に化けます。

    Files.writeString と Files.readString は、指定しない限り常に UTF-8 です。環境が変わっても結果は変わりません。別の文字コードで書かれた古いファイルを読む必要があるときだけ、Charset を追加の引数で渡します。

    解説

    追記したいのに上書きになってしまう、というのもよくある落とし穴です。Files.writeString は既定で中身を丸ごと置き換えます。末尾に足したいときは StandardOpenOption.APPEND を第 3 引数に渡してください。

    やってみよう

    Solution.writeAndRead(String content) を完成させます。

    1. throws Exception を付けるか、内部で try を使って IOException を扱えるようにする
    2. Files.createTempFile で一時ファイルを作る。パスの決め打ちは禁止です
    3. 受け取った content をその一時ファイルに書き込む
    4. 同じファイルを読み返した文字列を return する
    5. 後始末として一時ファイルを削除する

    テストは空文字列と英字と日本語の 3 つで、書いた文字列がそのまま返るかを見ています。文字コードを自分で指定しなくても日本語が往復することを、"日本語" のケースで確かめてください。

    要件

    1. java.nio.file.Files.createTempFile を使って一時ファイルを作成すること (パスのハードコードは禁止)
    2. Files.writeString(path, content) で書き込み、Files.readString(path) で読み返した値を return すること
    3. throws Exception か try-catch で IOException を適切に扱うこと

    ヒント

    `import` を書きたくない場合は、`java.nio.file.Files.createTempFile("demo", ".txt")` のようにフル修飾名で呼び出せます

    `Files.writeString` と `Files.readString` は Java 11 以降で使える API で、文字コードはデフォルトで UTF-8 です

    後片付けに `Files.delete(path)` を呼んでおくと、一時ファイルが残らず行儀のよいコードになります

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

    関連レッスン

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

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

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

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

    • BufferedReader と Stream API

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

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

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

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

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

    • 例外処理tryブロックで例外が発生→catchで捕捉して処理→finallyは例外の有無に関わらず必ず実行(リソース解放等)。
    • 処理計算や代入を表す長方形
    • 判断YES/NO 分岐を表す菱形
    • テストバグを見つける工程
    • ディレクトリファイルを整理するフォルダのこと。
    • 引数位置引数=順番で渡す。
    • 文字化け送受信側のエンコード不一致による表示崩れ
    • 文字コード文字に番号を割り当てるルール体系
    main.java
    エディタを読み込んでいます

    メモ

    Files でファイルに書き込む

    ⌘S で保存