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の理解が深まるほど効率的かつ安全なファイル処理ができるようになります。