プログラミング応用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を渡す。
では,次に実際のバイトデータ入出力ストリームを利用した例を示す
次へ進む