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 処理に使われます。