プログラミング応用b 第5回 『ファイル入出力の基礎1』-04 バイトデータ出力系ストリーム

■4.1 バイトデータ出力系統ストリームの関連クラス群

 さて,次にバイトデータ出力系のストリームについて見ていこう。下図Fig.4にバイトデータ
出力系統ストリームの一覧を示す。Fig.2のバイトデータ出力系統ストリーム一覧と比べると,
多くの類似点を見つけることができる。この類似点を意識することが,ストリームの全体像の理
解に役立つ。

 たとえば,バイトデータ出力系も基本ストリームとラッパストリームにグループ分けできるし,
ByteArray〜,Piped〜,File〜,Filtered〜,Data〜,Buffered〜,Object〜で始まるストリーム
クラスが,バイトデータ入力系にもバイトデータ出力系にも存在する,などなどである。以上の
ような理由により,Fig.2とFig.4をじっくり比較してみることをすすめる。(下図をクリックすると授業で扱わないクラスは非表示になる)



■ 4.2 スーパークラス OutputStream

 まず,バイト入力ストリームにInputStreamというスーパークラスがあったように,バイト
データ出力系統ストリームにも,OutputStreamというスーパークラス(抽象クラス)がある。
 OutputStreamのメソッドを下表Table 4に示す。


 バイトデータを書き込むメソッドとして,3つの write( ) がある。flush( ) は,出力系ストリーム
に特徴的なメソッドである。前述したように,入出力ではアクセス高速化のためにバッファを利用
している場合が多い。そのため,Javaのレベルでバッファリングを明示的に行っていなくても,
オペレーティングシステム(OS)のレベルではバッファリングされている場合も多いのである。
 このバッファに出力された内容を,実際に出力先に送信・書き出す動作をフラッシュ(flush)
言う。そして,フラッシュを行うメソッドが flush( ) なのである。

 もし,バッファがフラッシュされる前にプログラムが異常終了したり,出力先のディスク装置
が外されたりすると,プログラム上ではデータを書き込んだつもりなのに,実際にはディスクに
記録されていなかった,というような事態が生じてしまう。

 こういったことを防止し,確実に出力先にデータを書き込むためにも,適宜メソッド flush( )を
呼び出して,意図的にバッファのフラッシュを行うことが重要
である。ただし,あまり頻繁にフ
ラッシュすると,バッファを利用している意味が無くなり,アクセス速度が低下するので注意
が必要である。(ちなみに,トイレの水を流すことを flush と言う。イメージ似てますよね。)

 そして,クローズを行うメソッド close( )ももちろん用意されている。close( ) は,フラッシュを
行ってから,ストリームを閉じてくれる
(サブクラスでオーバライドするときには,当然そのよう
に定義する必要がある)。


■4.3 バイト出力用の基本ストリーム

 バイトデータ出力用のストリームは,Fig.4に示されているとおり,OutputStreamのサブクラス
として定義されている。そしてバイトデータ入力系と同様に,基本ストリームとラッパストリー
ムに分けることができる。まず,基本ストリームの方から紹介していこう。3つのバイト出力用の
基本ストリームのうち,授業では, FileOutputStream のみ扱う。

○FileOutputStream

 FileOutputStreamは,入力系のFileInputStreamに対応するもので,ファイルへバイトデータ
を書き込む出力ストリームである。主なコンストラクタとメソッドをTable 5-(2)に示す。書き込
み先としてオープンすると,指定したファイルが無いときには新しくファイルを作成する。また,
既に存在するファイルを指定すると,そのファイルの中身を消去して,ファイルの先頭から書き
込みを開始するようにオープンする。つまり,ファイルを「上書き」する。場合によっては,既
存のファイルの末尾から「追記(append)」する形でデータを書き込みたいときがある。その場合,
コンストラクタの第2引数にtrueを渡す。


■4.4 バイト出力用のラッパストリーム

 次に,バイトデータ出力系のラッパストリームを見ていこう。Fig.4でわかるとおり,ラッパス
トリームは,FilterOutputStreamとそのサブクラスである
 ・DataOutputStream
 ・BufferedOutputStream
 ・PrintStream
そして,OutputStreamの直接サブクラスである
 ・ObjectOutputStream
の計5個が用意されている。これらは,OutputStream型ストリームをラップして,特定の機能を
付加する。授業では,最期の ObjectOutputStream を除く4クラスのみ扱う。各クラスの概要
は次の通り。

○FilterOutputStream

 FilterOutputStreamは,入力系のFilterInputStreamに対応するもので,OutputStream型の
出力ストリームに,データ加工(フィルタ)機能を付加する。Table 5-(3)にコンストラクタを示す。
FilterOutputStream自体は何の機能も付加しないが,サブクラスのためにデータ加工のための骨
組みをあたえている。そして,実際に様々な加工をするように定義されているのが,3つのサブク
ラスDataOutputStream,BufferedOutputStream,PrintStreamである。

○DataOutputStream

 DataOutputStreamは,入力系のDataOutputStreamに対応するもので,主にプリミティブ型
を中心としたデータ値をストリームへ書き込む機能を,元のOutputStream型ストリームに付加
するラッパクラスである。そのため,プリミティブ型を中心としたデータ値をバイトデータとし
て書き込むためのメソッドを集めたインタフェイスDataOutputを実装している。インタフェイス
DataOutputの詳細を,下表Table 6に示す。また,コンストラクタと独自メソッドをTable 5-(4)
に示す。


○BufferedOutputStream

 BufferedOutputStreamは,入力系のBufferedOutputStreamに対応するもので,元のOutputStream
型ストリームに,バッファ機能を付加するラッパクラスである。出力速度の改善のためにも,
BufferedInputStreamと同様,積極的に使うべきラッパストリームと言える。コンストラクタ
Table 5-(5)に示す。

○PrintStream

 PrintStreamは,OutputStream型ストリームに,プリミティブ型や文字列の値を,文字表現
としての値を持つバイトデータ
として出力する機能を,元のOutputStream型ストリームに付加
するラッパクラスである。PrintStream型ストリームで馴染みが深いのは,
 System.out
であろう。これは,Systemクラスのstaticフィールドで,標準出力(standard output)と呼ばれ
るオープンずみの特別な出力ストリームオブジェクトである。print( )メソッドやprintln( )メソッ
ドを使って変数などの値を表示した経験から,どのような機能を持っているかは,だいたいお分
かりだろう。コンストラクタと独自メソッドをTable 5-(6)に示す。
 しかし,バイトデータ出力系ストリームであるPrintStreamよりも,文字出力の面でより改善
された文字データ出力ストリーム系のPrintWriter (次回紹介)があるので,標準出力として
System.outを使うとき以外は,PrintWriterを使うべき
である。なお,PrintStreamに対応する
バイトデータ入力系のストリームは用意されていない。

 



 では,次に実際のバイトデータ入出力ストリームを利用した例を示す


次へ進む


戻る