| プログラミング応用b 第7回『ファイル入出力の基礎』07-02. 『入出力ストリームの基礎と分類』 |
■2. 『入出力ストリームの基礎と分類』
■2.1 『ストリームのオープン・クローズ』
ストリームは,ストリームオブジェクトと呼ばれる専用のオブジェクトによって管理され
る(Fig.0)。ストリームオブジェクトは,生成時にコンストラクタへの実引数で指定された
入出力の対象をストリームに結びつけて,データ入出力の準備を行う。この作業を,
ストリームのオープン(open)と言う。オープンされたストリームに対しては,読み書きなど
の操作が可能になる。

入出力する必要が無くなったら,入出力先とストリームの関連づけを解除し,ストリームを
閉じる。この作業をストリームのクローズ(close)と呼ぶ。ストリームをクローズするには,
ストリームオブジェクトに用意されているclose( )メソッドを使用する。
Javaのオブジェクトは参照されなくなった段階で,自動的にメモリ領域が解放されるよう
になっているが,そのときにストリームオブジェクトはストリームのクローズを自動的に
行う。しかし,入出力の必要が無くなったストリームは,close( )メソッドを利用して,でき
るだけ早い段階で明示的にクローズするべきである。たとえば,オペレーティングシステムに
よっては,同時に開くことのできるファイルの上限数が制限されている場合があり,ストリー
ムのクローズが遅れれば,他のプログラムでファイルが開けなくなったりすることが起こりえ
るからである。
まとめると,ストリームの入出力の手順は,
(1)ストリームのオープン (ストリームオブジェクトの生成)
(2)ストリームを使った入出力
(3)ストリームのクローズ
という3段階になる。
■2.2 『4系統の入出力ストリーム』
ではまず,ストリームを扱うために,ストリームオブジェクトのクラス群をざっとながめて
みよう。ストリーム関係のクラス群は,java.ioというパッケージにまとめられている。ioとは,
Input/Outputの略である。
さて,Fig.1にあるように,ストリームによる入出力では,
・入力には入力用ストリームを
・出力用には出力用のストリームを
使用する。つまり,入力ストリーム用のクラスと,出力ストリーム用のクラスがあることになる。
また,ストリームに入出力するデータが,
・テキストを構成する文字データか
・画像や数値データのようなバイト単位のバイナリデータ(バイトデータとも言う)か
という違いもある。
文字データで記録されているファイルのことをテキストファイル(text file)と呼ぶ。我々がいつも
作成しているプログラムのソースファイルや,ファイル拡張子が .txt, .csv などのテキストエディタ
と呼ばれるソフトウェアで読み書きできるファイルがその典型的な例である。コンピュータにお
いて,文字は整数値として表現されており,この特定の文字と特定の整数値の対応のさせ方を
文字コードと呼ぶことを思いだそう(前期第2回の「5. 情報の表現」のこちらとこちら)。
バイナリデータとは,文字として解釈することを前提としない,画像データや音データを表す
データのことで,中身をそのまま見るとビット(0か1)データの集まりにしか見えないため,
バイナリ(binary)データと呼ばれる。※binaryとは「2つから成る」という意味。
バイナリデータをそのままファイルに保存したものをバイナリファイル(binary file)と呼ぶ。
Javaでは,バイナリデータはバイト単位で取り扱うのでバイトデータと呼ばれることもある。
もちろん,コンピュータで扱うデータはすべてビット(0か1)データの集まり,つまりバイナリ
データとして表現されており,それをそのままバイナリデータ(多くは数値)として解釈するか
(特定の文字コードにおける)文字として解釈するか,の違いということである(下図)。
下図の内容を持つファイル AandB.txt

なお,「文字」というものは文字コードによって,各文字が1バイトで表現されていたり,
2バイトで表現されていたり,3バイトで表現されていたりするので,単純にバイト単位で
入出力をするわけにはいかない。
というわけで,ストリームの種類は
入出力の2系統 × 文字データ・バイトデータの2系統
の計4系統のストリームに大きく分類できることになる(下表)。
| 入力系統ストリーム | 出力系統ストリーム | |
| 文字データ (今回解説する) | (1) 文字データ入力系ストリーム | (2) 文字データ出力系ストリーム |
| バイトデータ (自主学習用資料) | (3) バイトデータ入力系統ストリーム | (4) バイトデータ出力系統ストリーム |
本授業では,4系統のストリーム群のうち,文字データ入出力系の2系統(入力と出力)の
ストリーム群(上表で黄色の部分(1),(2))に解説する。