1. 英字 hello を書いて読むと hello が返る
  2. 空文字列を書いて読むと空文字列が返る
  3. 日本語 (UTF-8) を書いて読むと同じ文字列が返る
  4. 改行を含む複数行のテキストもそのまま往復する
コース一覧
Java 中級:コレクション・Stream・例外処理
Files でファイルに書き込む

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分

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 を適切に扱うこと

入出力例

writeAndRead("hello") → "hello" writeAndRead("") → "" writeAndRead("日本語") → "日本語" writeAndRead("line1 line2") → "line1 line2"

ヒント

`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 で保存