Java バイトストリーム

バイトストリーム(Byte Stream)は、8 ビットのバイト(byte)単位で入出力を制御するため、バイナリデータとして扱うことができる。java.io パッケージのクラスのうち、バイトストリーム関連クラスは次のとおりである。

  • InputStream
    • FileInputStream
    • FilterInputStream
      • BufferedInputStream
      • DataInputStream
    • ObjectInputStream
  • OutputStream
    • FileOutputStream
    • FilterOutputStream
      • BufferedOutputStream
      • DataOutputStream
    • ObjectOutputStream

InputStream/OutputStream 抽象クラス

InputStream クラスと OutputStream クラスは抽象クラスであるため、実際のオブジェクトを生成することはできない。

InputStream クラス

InputStream クラスは、バイトストリームの入力機能を提供する。

InputStream メソッド

InputStream クラスは、入力ソースからデータを読み込むメソッドを持っている。

メソッド 説明
int available() throws IOException 現在読み取り可能なバイト数を返す。
void close() throws IOException 入力ストリームを閉じる。
void mark(int readlimit) 入力ストリームの現在位置をマークする。
boolean markSupported() その入力ストリームで mark() によって指定された地点があるかどうかをチェックする。
abstract int read() throws IOException 入力ストリームから 1 バイトを読み取り、int 値(0~255)として返す。これ以上読み取る値がない場合は -1 を返す。
int read(byte[] b) throws IOException byte[] b 分のデータを読み取って b に保存し、読み取ったバイト数を返す。
int read(byte[] b, int off, int len) throws IOException len 分を読み取り、byte[] b の off 位置に保存し、読み取ったバイト数を返す。
void reset() mark() を最後に呼び出した位置へ移動する。
long skip(long n) throws IOException 入力ストリームから n バイト分のデータをスキップし、スキップしたバイト数を返す。

InputStream クラスのうち、抽象メソッドである read() はデータを入力するためのメソッドである。read() メソッドは入力ストリームから 1byte を読み込むためのメソッドであり、EOF(End of File)に到達すると -1 を返して、読み取り処理が終わったことを知らせる。

read() メソッドが 1byte ずつ読み込むのに対し、read(byte[] b) メソッドはユーザーが指定した byte[] を利用して、必要なサイズをまとめて読み込む。

read() メソッドの戻り値のデータ型を見ると、byte ではなく int である。Java の数値体系では、byte を基準に -128 から 127 まで表現できる。しかし read() メソッドで読み取る値は正数を基準に表現するため、この場合は 0 から 127 までしか使用できない。これを解決するために、より大きな型を返すようにして 0 から 255 まで使用できるようにし、負数である -1 を特殊な入力値として処理するようにしている。

available() メソッドは、ストリームから読み取れるバイト数を取得し、それを基準に byte[] を作成してまとめて読み取ることができる。

OutputStream クラス

OutputStream クラスは、バイトストリームの出力機能を提供する。

OutputStream メソッド

OutputStream クラスは、バイトストリームを出力するメソッドを持っている。

メソッド 説明
void close() throws IOException 出力ストリームを閉じる。
void flush() throws IOException バッファに残った出力ストリームをすべて出力する。
abstract void write(int i) throws IOException 整数 i の下位 8 ビットを出力する。
void write(byte buf[]) throws IOException buf の内容を出力する。
void write(byte buf[], int index, int size) throws IOException buf の index 位置から size 分のバイトを出力する。

出力メソッドには 3 つの形式があり、そのうち 1 つ目は write(int i) メソッドである。このメソッドは 1byte を出力するメソッドであり、引数として byte ではなく整数型(0~255)を受け取り、抽象メソッドとして宣言されているため下位クラスで再定義される。write(byte buf[]) メソッドは byte を配列として受け取って出力する。write(byte buf[], int index, int size) メソッドは、引数として byte 配列と開始位置およびサイズを受け取る。

flush() メソッドはバッファ(buffer)に関連しており、バッファは入出力を少し速くするのに役立つ。write メソッドを呼び出してデータを出力すると、データはすぐに出力されるのではなく、まずバッファに蓄積される。バッファにデータがある程度蓄積された後に flush() メソッドが呼び出されると、その時点でデータが出力され、バッファは空になる。flush() メソッドを呼び出さないと、出力データがバッファにだけ蓄積されるため、出力されない場合がある。このため、通常は下位クラスで自動的に flush() メソッドが呼び出されるように実装される。