ゼロから学ぶJavaの入出力:ストリームを理解する
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ではこのテクニックを実際に利用している。
- 企画特集
-
いまさら聞けないクラウドのなぜ
-
月5000円から始める災害対策
-
フォーチュン500企業の99%が利用
-
デスクトップTCOを劇的に下げる
-
BtoBマーケティングの鍵!
-
今後中小企業でもEDIの転換期
-
マイナンバー漏えいリスクへの対策
-
クラウド型BPMツールが成功へ導く
-
不可能を可能にするマシン、登場!
-
動画で解説!クラウドは難しくない
-
ビッグデータに関する情報が満載
-
IoT活用最前線!
-
Javaの現在、そして未来
-
リモートデスクトップ導入の実際
-
これがHadoop利活用の現実解
-
モバイル活用成功の秘訣教えます
-
ワークスタイル変革事例
-
コスト効率の高いBCP/DRの実現
-
JavaSE8―ラムダ式の基礎
-
VDI環境のこんなところに"ムダ"が
-
特別鼎談--IDC×アセンテック×デル
-
東日本大震災から4年
-
「ハッカーはアプリを見ている!」
-
SSL VPN導入--3つの利用ケース
-
手軽に安全にファイル共有してますか