ゼロから学ぶJavaの入出力:ストリームを理解する

文:Jeff Hanson(TechRepublic)  翻訳校正:原井彰弘
2007-12-17 14:00:00
  • このエントリーをはてなブックマークに追加

 Javaではすべての入出力がストリームベースになっている。そのため、一度ストリームの構文を覚えてしまえば、どのようなタイプの入出力も扱えるようになる。本稿では、Javaにおけるストリームの操作方法をいくつか紹介する。

 Javaの入出力(I/O)機能を利用すると、標準化されたシンプルなAPIを用いて、さまざまなデータソースからの文字やバイトデータを読み書きできるようになる。本稿では、入出力関連のクラスやインタフェースを調べ、Javaプラットフォーム上でどのような操作を行うことが可能であるかを検証する。それでは、まずJavaのストリームとは何なのかを調べてみよう。

ストリーム

 Javaの入出力機能はすべて、文字やバイトシーケンスの流れを表す「ストリーム」という概念をもとに設計されている。Javaにおいては、ストリームはデータの読み書きを行う標準化された機構であり、Javaに含まれている可変のデータソースを表すオブジェクトはすべて、ストリームとしてデータを読み書きするメソッドを提供している。

 ストリーム指向の入出力を扱うクラスは、多くの場合java.ioパッケージに含まれている。このパッケージの中心となるのはInputStreamクラス、OutputStreamクラスの2つの抽象クラスだ。他のストリーム指向のクラスは、すべてこれらのクラスを拡張して定義されている。

 java.ioパッケージには、文字やバイトの読み書き操作を行うInputStreamクラス、OutputStreamクラスをはじめ、便利な抽象化機能を提供するクラスやインタフェースが多数含まれている。例を挙げると、ObjectInputStreamクラスはストリームからのデータをJavaのオブジェクトとして読み取る機能を提供している。また、ObjectOutputStreamクラスはJavaのオブジェクトをストリームへ書き込む機能を提供している。

読み取りと書き込みの最適化

 JDK 1.1では、読み書き関連のクラスが多数追加され、より使い勝手を考慮した抽象化や入出力パフォーマンスの改善が行われた。例としては、文字ベースで入力ストリームや出力ストリームへの読み書き機能を提供するBufferedReaderクラスとBufferedWriterクラスが挙げられる。BufferedReaderクラスでは、バッファを利用して複数の文字や配列、行単位での読み取りをより効率的に行っている。また、BufferedWriterクラスでも、バッファを利用して複数の文字や配列、文字列の書き込みをより効率的に行っている。これらBufferedReaderクラスやBufferedWriterクラスで利用されるバッファのサイズは、自由に調整することが可能である。

 Javaの入出力フレームワークには、読み書きを行うクラスはほかにも多数含まれている。たとえば、LineNumberReaderクラス、CharArrayReaderクラス、FileReaderクラス、FilterReaderクラス、PushbackReaderクラス、PipedReaderクラス、StringReaderクラスなどはすべてそうである。これらのクラスはInputStreamクラスやOutputStreamクラスのラッパであるため、類似したメソッドを提供している。しかし一方で、ファイルや文字配列、文字列などの読み書きに特化した、より効率的で便利な抽象化機能も備えている。

データの読み取り

 入力ストリームは普通、データソースオブジェクトから取り出したり、読み取り関連のストリームオブジェクトを作成した際に、自動的に開かれる。たとえば、ファイルの入力ストリームを開くには、ファイルの名前をjava.io.FileReaderクラスのコンストラクタに渡すだけでよい。例を次に示す。

java.io.FileReader fileReader = new java.io.FileReader("/home/me/myfile.txt");

 FileReaderの入力ストリームから次のバイトデータを読み取るには、パラメータを付加せずにreadメソッドを呼び出す。リストAに示されているのは、ファイルからテキストを1文字ずつ読み取り、System.outに書き込むプログラムの一部である。

リストA

int aChar = 0;
while ((aChar = fileReader.read()) >= 0)
{
System.out.print((char)aChar);
}

 入力ストリームからcharの配列へ指定したバイト数を読み取るには、char[]型のパラメータを1つ受け取るreadメソッドを使用する。配列の長さは、一度に読み取る文字数を決めるのに用いられる。次に示すリストBではこのテクニックを実際に利用している。

  • 新着記事
  • 特集
  • ブログ