Java Gold SE11対策:Reader / Writer による文字ストリーム処理 ― 文字単位の読み書きを理解する

アイキャッチ画像

Java Gold SE11 試験では、InputStream / OutputStream だけでなく、Reader / Writer といった「文字ストリーム」の扱いについても出題されます。特に、日本語やUnicode文字など、バイト単位では扱いづらい文字データに対して、適切にReader/Writerを使いこなせるかどうかがポイントです。
この記事では、Reader / Writer の基本構造と代表的なサブクラス、Buffered読み書きやファイル操作との関係、試験で出やすい落とし穴をまとめて解説します。

Reader / Writer の基本構造

抽象クラス主な用途
Reader文字データの読み込み
Writer文字データの書き込み
  • 両者ともに java.io パッケージに属します。
  • 1文字(または複数文字)単位で I/O を行います。

Reader の代表的なサブクラスと用途

クラス名用途
FileReaderファイルからの文字読み込み
BufferedReader読み込みの効率化+1行ずつ読める
InputStreamReaderバイトストリームを文字ストリームに変換(エンコーディング指定可能)

例:BufferedReaderで1行ずつ読み込む

try (BufferedReader reader = new BufferedReader(new FileReader(“input.txt”))) {

    String line;

    while ((line = reader.readLine()) != null) {

        System.out.println(line);

    }

} catch (IOException e) {

    e.printStackTrace();

}

試験ポイント:

  • read() は1文字ずつ、readLine() は1行読み込み
  • readLine() は null を返すことで終端を示す
  • InputStreamReader を使うと、InputStream を Reader に変換可能

Writer の代表的なサブクラスと用途

クラス名用途
FileWriterファイルへの文字書き込み
BufferedWriter書き込みの効率化+行単位出力
OutputStreamWriter文字→バイト変換+エンコーディング指定

例:BufferedWriterで1行ずつ書き込む

try (BufferedWriter writer = new BufferedWriter(new FileWriter(“output.txt”))) {

    writer.write(“こんにちは”);

    writer.newLine();

    writer.write(“Java Gold 対策中!”);

} catch (IOException e) {

    e.printStackTrace();

}

試験ポイント:

  • write(String) は文字列書き込み
  • newLine() で改行コード出力(OS依存)
  • flush() を忘れると出力されない場合がある
  • 上書き or 追記モードの指定に注意:

new FileWriter(“output.txt”, true); // 第2引数 true → 追記モード

➡ デフォルトは 上書きモード。追記したい場合は true を明示的に指定する必要あり。

InputStreamReader / OutputStreamWriter とは?

バイトと文字の橋渡し役となるクラス。たとえば、外部ファイルをUTF-8で読みたい場合:

InputStreamReader reader = new InputStreamReader(

    new FileInputStream(“file.txt”), StandardCharsets.UTF_8);

試験ポイント:

  • コンストラクタで Charset を指定しないと、プラットフォーム依存
  • new InputStreamReader(…) と new OutputStreamWriter(…) の違いに注意

Reader / Writer 系の試験での注意点

問題パターン説明
read() / readLine()戻り値が int / String である点に注意
flush() の必要性BufferedWriter 使用時に必須
close() の漏れtry-with-resources でカバーできる
文字 vs バイト文字系は Reader/Writer、バイト系は Input/OutputStream
追記 vs 上書きFileWriter(path, true) で追記指定が必要

おわりに

文字ストリームは、マルチバイト文字やテキスト処理を行う上で欠かせない存在です。Reader / Writer にはBuffered〜系や変換系のクラスも多く、APIの理解が深まるほど効率的かつ安全なファイル処理ができるようになります。