Java Gold SE11対策:InputStreamとOutputStream ― バイトストリームの基本

Java Gold SE11 試験では、低レベルの I/O 処理として「バイトストリーム(InputStream / OutputStream)」の扱いも重要な論点です。特に、ファイルやネットワークからの読み込み・書き込みに関して、適切なストリームの選定や例外処理の扱いが問われることがよくあります。
この記事では、InputStream / OutputStream の基本構造と代表的なサブクラス、それぞれの使い所や試験で注意すべき点をまとめます。
目次
InputStream / OutputStream の基本構造
抽象クラス | 主な用途 |
InputStream | バイトデータの「読み込み」 |
OutputStream | バイトデータの「書き込み」 |
どちらも java.io パッケージに属し、基本的にはファイル・メモリ・ネットワークなどの I/O ソースに対してバイト単位で入出力を行います。
InputStream の代表的なサブクラスと用途
クラス | 用途 |
FileInputStream | ファイルからのバイト読み込み |
BufferedInputStream | 読み込みのバッファリング(効率化) |
ByteArrayInputStream | バイト配列からの読み込み |
例:ファイルからバイトを読み込む
try (InputStream is = new FileInputStream(“input.txt”)) {
int data;
while ((data = is.read()) != -1) {
System.out.print((char) data); // 1バイトずつ文字として表示
}
} catch (IOException e) {
e.printStackTrace();
}
試験ポイント:
- read() は 1バイトずつ読み込む。戻り値が -1 のとき EOF(終端)
- try-with-resources 構文が使える(Closeable の実装クラス)
OutputStream の代表的なサブクラスと用途
クラス | 用途 |
FileOutputStream | ファイルへのバイト書き込み |
BufferedOutputStream | 書き込みのバッファリング(効率化) |
ByteArrayOutputStream | バイト配列への書き込み |
例:ファイルにバイトを書き込む
try (OutputStream os = new FileOutputStream(“output.txt”)) {
os.write(“Hello”.getBytes()); // 文字列をバイト配列に変換して書き込み
} catch (IOException e) {
e.printStackTrace();
}
試験での注意点:
- write(byte[]) は一括書き込みに便利
- write(int) は 1バイトのみ書き込む
- 追記モードの指定も重要:
OutputStream os = new FileOutputStream(“output.txt”, true); // 第2引数 true で追記モード
➡ デフォルトは 上書き。追記したい場合は明示的に true を渡すこと。
InputStream / OutputStream の共通メソッド
メソッド名 | 説明 |
read() | 1バイト読み込み。戻り値は int(-1 = 終端) |
write(int) | 1バイト書き込み |
close() | ストリームを閉じる |
flush() | バッファの中身を強制的に書き出す(OutputStream) |
BufferedInputStream / BufferedOutputStream の役割
低レベルの I/O は 1 バイトずつ処理されるとパフォーマンスが悪くなるため、バッファリングによって効率的な入出力が可能になります。
Buffered〜 系のクラスは、ラップして使用するのが基本:
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(“input.txt”))) {
int data;
while ((data = bis.read()) != -1) {
// 高速に読み込める
}
}
試験での注意点:
- BufferedOutputStream では flush() の重要性が上がる
- Buffered 系は他の InputStream / OutputStream を補助ストリームとしてラップ
試験で問われる観点まとめ
問題パターン | 注意点 |
read() / write() の戻り値・引数 | 戻り値は int、引数は int または byte[] |
例外処理 | すべて IOException がスローされる |
close() の有無 | try-with-resources を使えば自動で閉じられる |
flush() の必要性 | BufferedOutputStream で flush() を忘れると書き込まれないことがある |
バッファリングの目的 | パフォーマンス改善のため(効率的な I/O) |
おわりに
今回は、Java I/O における基本中の基本である InputStream / OutputStream に焦点を当てました。これらのクラスは、「文字」ではなく「バイト」を扱う点がポイントで、低レベルな I/O 処理に使われます。