はじめに
第6回目の本稿は、ストリームと入出力処理をとりあげます。入出力処理は、プログラムと外部とのデータのやりとりのことで、Javaでは、この入出力処理をストリームという仕組みを介して行います。Java SEでは、このような入出力の処理を、java.ioパッケージのAPIで提供しています。
なおAndroid SDKに含まれる基本APIは、現行のJava SE 6とまったく同じというわけではありません。API Levelが低いと、Java SE 6に含まれるクラスやメソッドの一部が、実装されていない場合があります。
API Levelの微妙な違いは、Android Developersサイトにて確認するようにしてください。
対象読者
Androidアプリケーションの開発を始めたい方で、JavaとEclipseのごく基本的な知識がある方を対象とします。
入出力とストリーム
一般にプログラムは、それ単体のみで処理が完結するものはあまりありません。プログラムの外部から、何らかのデータを受けとり(入力)、それを処理して、結果を外部に書きだす(出力)というパターンがベースになっています。
例えばデータの入力としては、ファイルからの読み込み、ネットワークでの通信データの受信などがあります。出力は反対の処理となり、ファイルへの書き込み、通信データの送信となります。また画面への表示も、出力といえます。
このような入出力処理を、Javaでは、ストリームという仕組みを介して行うのが基本です。ストリームとは、直訳すると「小さな川」という意味ですが、Javaではデータの流れとその通り道を意味し、データの受け渡しを抽象化したものです。あらゆるデータの入出力における基本的な概念です。
ストリームの種類
Javaのストリームには、ファイルやネットワークなどからデータを受け取る入力ストリームと、ファイルやネットワークにデータを送りだす出力ストリームの2種類があります。
またストリームは、流れるデータの種類でも分かれています。バイト単位(バイナリ)でデータを扱うバイトストリームと、文字単位(16ビットのUnicode文字)でデータを扱う文字ストリームの2つに分かれます。例えば通常のテキストなら文字ストリームとなり、画像データなどはバイトストリームを用います。
したがって入出力の違いを合わせると、java.ioパッケージに含まれるストリーム関連クラスは、4つに区分できることになります。それぞれには、基本となる抽象クラスが存在し、ストリーム関連のクラスは、主にその抽象クラスを継承して作られています。
主なストリームクラス
文字ストリームの入出力は、Reader/Writerクラスが行います。一方バイトストリームの入出力は、InputStream/OutputStreamクラスが担います。これら4つのクラスがスーパークラスとなり、ファイルに特化した入出力クラスや、バッファ付きの読み書きをサポートするクラスなど、多くのサブクラスが提供されています。
文字ストリーム | バイトストリーム | クラスの概要 | ||
入力 | 出力 | 入力 | 出力 | |
java.io.Reader | java.io.Writer | java.io.InputStream | java.io.OutputStream | 抽象スーパークラス |
BufferedReader | BufferedWriter | BufferedInputStream | BufferedOutputStream | バッファリングし効率的な処理を行う |
LineNumberReader | - | LineNumberInputStream | - | 読み込みの間に行番号を管理する |
CharArrayReader | CharArrayWriter | ByteArrayInputStream | ByteArrayOutputStream | 既存の配列をストリームとして扱う |
FileReader | FileWriter | FileInputStream | FileOutputStream | ファイルをストリームとして扱う |
FilterReader | FilterWriter | FilterInputStream | FilterOutputStream | ストリームにフィルタ処理を行う |
PushbackReader | - | PushbackInputStream | - | データの先読み処理を行う |
PipedReader | PipedWriter | PipedInputStream | PipedOutputStream | パイプによる操作を行う |
StringReader | StringWriter | StringBufferInputStream | - | メモリ内のStringをストリームとして扱う |
- | PrintWriter | - | PrintStream | データを出力する |
- | - | InputStreamReader | OutputStreamWriter | 文字ストリームとバイトストリームを連携する |
- | - | ObjectInputStream | ObjectOutputStream | オブジェクトをストリームから読み書きする |
- | - | DataInputStream | DataOutputStream | 環境に依存しないデータの読み書きを行う |
- | - | SequenceInputStream | - | 複数の読み込みストリームを集約する |
New I/Oライブラリ
今回解説は割愛していますが、Java 1.4からは、これまで説明してきたストリームによる入出力クラスに加え、より機能を拡張した新しい入出力ライブラリが導入されています。New I/Oと呼ばれるもので、バッファ管理、ノンブロッキングI/O、文字セットや正規表現のサポートなどの機能が提供されています。Android SDKにも含まれています。