プログラミング応用b 第5回 『ファイル入出力の基礎1』 -01 2種類の入出力方法(ランダムアクセス入出力とストリーム入出力)


 プログラムを学習しはじめても,なかなか自分で役に立つプログラムを作成できない
場合もあるのではないだろうか。しかし,ファイルからデータを読み込んだり,ファイル
にデータを書き込んだりすることによって,プログラムの応用範囲は飛躍的に広がる。
 今回から,Javaの入出力について解説する。

【入出力】

 まず,コンピュータで言う「入出力(input/output)」ということを考えてみよう。
プログラムが通常,扱う世界は,おおざっぱに言って,「CPUとメモリ」である。Java
で言えば,「Java仮想マシンの中」ということになる。
 しかし,「CPUとメモリ」の世界だけでプログラム処理を行っても意味が無い。たとえ
ば,計算を行ったら,その結果を外界に伝えなくてはならない。そのため,私たちは
  System.out.println((a * b) / 2.0);
というようなメソッド呼び出しを行って,計算結果を表示端末の画面に表示しているので
ある。これは,まさに「CPUとメモリ」の外部(この場合は,表示端末)へ情報を送り出し
て,人間に対して計算結果を伝えていることになる。このように,「CPUとメモリ」の外
部にデータを送り出すことを,「データを出力(output)する」と言う。
 また,「CPUとメモリ」の閉じた世界の中で,いつも同じデータに対して同じ処理を行
っても,同じ結果が得られるだけで,これもまた,あまり意味のないものと言える。ソフ
トウェアが有意義な「仕事」をするためには,必要に応じて,「CPUとメモリ」の世界の
外からデータを取り入れて,処理を行う必要がある。このように,外界から「CPUとメモ
リ」の世界へデータを取り入れることを,「データを入力(input)する」と言う。


■1. 2種類の入出力方法

 さて,肝心の入出力方法だが,主に2つのアプローチがある。

●ランダムアクセス入出力

 ひとつは,ファイルなどの入出力先をまるで配列(同じデータ型の多くのデータが隙間無
く詰められたもの)であるかのように扱って,ランダムアクセスを行う方法である。
 ランダムアクセスとは,アクセスしたいデータへ直にアクセスするアクセス方法である。
たとえば,配列では要素へのアクセスはランダムアクセス方式で行われる。aという名前の
配列があったとそして,aの10番目の要素(a[10])へアクセスしたいときは,その要素へ直
接アクセスできる。
 たとえばJavaには,ファイルを配列のようなものと考え,ファイルに記録されているデー
タにランダムアクセスすることを可能にするRandomAccessFileというクラスがある。
 しかし,ランダムアクセスを行うには,入出力先の外部機器自体がランダムアクセス機能
を提供していなくてはならない。そのような外部機器は少なく,実質的には,ファイルを記
録するディスクドライブしかないと言って良いだろう。

●ストリームによる入出力

 もうひとつの方法は,外部からデータを順々に入力したり,外部へデータを順々に出力し
ていくような方法である。Javaをはじめ,多くのプログラミング言語では,このような入出
力を,ストリーム(stream)という概念で表現している。
 下図Fig.1にストリームの概念を示す。ストリームは,外界と「CPUとメモリの世界」(Java
仮想マシン)を結ぶ「データの流れ道」のようなもので,このストリームの中をデータが順々
に流れていく。


 たとえば,上図Fig.1では,キーボードからタイプされた“hello!”という文字を表す6個の
バイトデータが,最初に'h',次に'e',という具合にストリームに流れていき,やはり'h','e',
'l','l','o','!'の順番でJava仮想マシンに入力されていく。
 同様に,“hello!”という文字を表す6個のバイトデータが出力用のストリームを通って,
モニタ(正確に言えば,表示端末)に出力・表示される。stream とは,英語では「小川」
を意味する単語である。まさにストリームはデータの流れる小川と言える。

 ここで重要なのは,入力元からストリームへ入ったデータは,その順番どおりにJava仮想
マシンへ入力されることである。同様に,Java仮想マシンから出力されたデータは,その出
力された順番どおりに出力先へ届く。ここがストリームのアクセスがランダムアクセスと大
きく異なるところである。
 ストリームによって入出力する外部機器は,ランダムアクセスのような高機能を持つ機器
である必要は無い。入力元の機器は,データを順次ストリームに送り出す機能を持ってれば
いいだけであるし,出力先の機器は,ストリームからやってくるデータを順次受け入れる能
力を持っていればOKである。そのため,ほとんどの入出力機器をストリームで扱うことが可
である。そのためFig.1に示すように,ファイルはもちろん,キーボードや表示端末とのデ
ータのやりとり,そしてデータ通信でのデータの送受にもストリームを使うことができる
である。



では,まずストリームによる入出力から見ていこう。

次へ進む

戻る