![]() ![]() ![]() ![]() |
入出力ストリーム |
java.io パッケージは InputStream と OutputStream の2つのクラスを含み、パッケージの他の大部分のクラスがこれらから派生する。
InputStream
クラスは、最小のプログラムインタフェースと入力ストリームの部分的な実装を提供する抽象的なスーパークラスである。 InputStream クラスは、バイトあるいはバイトの配列を読んだり、ストリーム中の位置をマークしたり、入力のバイトをスキップしたり、読み込み可能なバイト数を見つけ出したり、ストリーム内の現在位置を再設定するなどのメソッドを定義する。 入力ストリームは、それを作成する時に自動的に開かれる。 ストリームは、close() メソッドで明示的にストリームを終えるか、あるいは、InputStream オブジェクトがもう参照されない時に発生するガベージコレクションにより解放され、暗黙的に閉じることができる。
OutputStream
クラスは、最小のプログラムインタフェースと出力ストリームの部分的な実装を提供する抽象的なスーパークラスである。 OutputStream は、ストリームにバイトあるいはバイトの配列を書くメソッドを定義する。 出力ストリームは、それを作成する時に自動的に開かれる。 ストリームは、close() メソッドで明示的にストリームを終えるか、あるいは、OutputStream オブジェクトがもう参照されない時に発生するガベージコレクションにより解放され、暗黙的に閉じることができる。
java.io パッケージには、特定の入力あるいは出力の関数を実装する InputStream と OutputStream のサブクラスがいくつか含まれている。 たとえば、 FileInputStream と FileOutputStream は、ネイティブなファイルシステム上のファイルで操作する入出力ストリームである。
次の2つの図の最初の図は java.io パッケージにおける入力ストリームクラスのクラス階層を示す。 2 番目の図では、java.io パッケージにおける出力ストリームクラスのクラス階層を示す。
注: 両方の図上のクラスシンボルのどれかをクリックすると、クリックされたクラスの API ドキュメンテーションにアクセスすることができる。
図からわかるように InputStream は Object クラスから継承される。6つのクラスが InputStream から直接継承される。 InputStream の子孫である FilterInputStream は、それ自身が abstract クラスで4つの子をもつ。
図からわかるようにObject クラスから OutputStream が継承され、4 つのクラスが OutputStream から直接継承される。 OutputStream の子孫である FilterOutputStream は、それ自身が abstract クラスで3つの子をもつ。
単純な入出力ストリーム
次に InputStream と OutputStream から直接継承されるサブクラスの概要を示す。これらのサブクラスはnon-abstract(非抽象)クラスである。
- FileInputStream と FileOutputStream
- ネイティブなファイルシステム上のファイルへのデータの読み書きを行なう。
- PipedInputStreams と PipedOutputStream
- パイプの入出力コンポーネントを実装する。 パイプはプログラム(あるいはスレッド)からの出力を別のプログラムの入力に接続するために使用される。 PipedInputStreams は PipedOutputStream に接続し、 PipedOutputStream は PipedInputStreams に接続しなければならない。
- ByteArrayInputStream と ByteArrayOutputStream
- メモリ上のバイト配列へのデータの読み書きを行う。
- SequenceInputStream
- 1つの入力ストリームに複数の入力ストリームを連結する。
- StringBufferInputStream
- プログラムは入力ストリームであるかのように、 StringBuffer から読み込むことができる。
このレッスンで後述する入出力ストリームの使用では、これらのストリームを説明する。
フィルタストリーム
FilterInputStream と FilterOutputStream は それぞれInputStream と OutputStream のサブクラスであり、両方ともそれら自身は abstract クラスである。 これらのクラスは、データが読み込まれたり書き込まれるときにデータ処理するフィルタストリームのインタフェースを定義する。 たとえば、フィルタストリームの BufferedInputStream と BufferedOutputStream はデータをバッファリングし、読み取りと書き込み時の処理スピードを上げる。
- DataInputStream と DataOutputStream
- プリミティブなJavaのデータ型を機械に依存しない形式で読み書きする。
- BufferedInputStream と BufferedOutputStream
- 読み書きの間データをバッファに入れる。これにより、オリジナルのデータ発信元へのアクセス数を削減できる。 バッファに入れるストリームは一般に、類似のバッファ付でないストリームに比べはるかに効率的である。
- LineNumberInputStream
- 読み取りの間,読み込んだ行数を管理する。
- PushbackInputStream
- データを1 バイト押し戻せるバッファを持った入力ストリーム。 ストリームからデータを読む時、次に行うことを決めるために、ストリーム上の次の文字を知る(peek)ことが有効な場合がある。 ストリーム上の1文字をpeekする場合は、この文字が再度読み取れ、正常に処理できるようにこの文字を元に戻す必要がある。
- PrintStream
- メソッドを出力するのに便利な出力ストリーム。
このレッスンで後述するフィルタストリームとの作業 では、フィルタストリームの使用法と独自のフィルタストリームの実装法を示す。
その他・・・
java.io にはstrean クラスの他に次のクラスが含まれている。
- File
- ネイティブなファイルシステム上のファイルを表す。 ネイティブなファイルシステム上のファイルのために File オブジェクトを作成し、(完全パス名のような)そのファイルについての情報をこのオブジェクトに対して問い合わせることができる。
- FileDescriptor
- 開かれているファイルあるいは開かれているソケットに対するファイルハンドル(あるいは記述子)を表す。 一般にこのクラスは使用しない。
- RandomAccessFile
- ランダムアクセスファイルを表す。
- StreamTokenizer
- トークンの中にストリームのコンテンツを入れる。 トークンは,テキスト解析アルゴリズムによって識別される(語、シンボルのような)最小のユニットである。 StreamTokenizer オブジェクトは、どんなテキストファイルの解析にも使用することができる。 たとえば、 このオブジェクトを使用して、Java ソースファイルを変数名演算子に、あるいは HTML ファイルをHTML タグや語などに解析することができる。
そしてjava.io は3つのインタフェースを定義している。
- DataInput と DataOutput
- これらの2つのインタフェースは、機械に依存しない形式でプリミティブな Java 型を読み込んだり、書き込めるストリームを記述する。 DataInputStream、DataOutputStream、および RandomAccessFile はこれらのインタフェースを実装する。
- FilenameFilter
- File クラスの list() メソッドは、ディレクトリのどのファイルを表示するか判断するために、FilenameFilter を使用する。 FilenameFilter はそれらの名前に基づいたファイルを受け入れたり、拒絶する。 FilenameFilter を使用して、foo.* などのような単純な正規表現スタイルファイル検索パターンを実装することができる。
ランダムアクセスファイルの使用では、ランダムアクセスファイルの使用方法について説明する。 同様に DataInput と DataOutput インタフェースを実装するオブジェクトのフィルタを書く方法について示す特別な節を用意している。 この方式で実装されたフィルタは、ランダムアクセスファイルや順編成ファイル上で使用できるので、通常のフィルタストリームよりも柔軟である。
![]() ![]() ![]() ![]() |
入出力ストリーム |