Ex1. ファイルを読み込んでみよう(005.5〜)


プログラムからファイルを読み込むにはFileクラスやStreamクラスを利用します。
オブジェクト指向 プログラミング講座005.5までできる方を対象としたものです。

ファイルを読み込む仕組みについて

まず、プログラミングでファイルを読み込む際の動作について知る必要があります。

d9

だいたいファイルを読み込む時は、パソコンの中のHDDのファイルだろうが、ネットワーク上にあるファイルだろうが扱い方は似ています。

ファイルを読み込むために、ストリームというものを作り、ストリームを利用してファイルを読み込むのです。(書き込む際もこのような感じですね。)

サンプルコード

では1つ1つ意味を理解しましょう。

ストリームを取得する

まず、ファイルを読み込むためにストリームを取得します。取得の仕方は様々ありますが、最も覚えやすいFile.OpenReadメソッドを使います。

パラメータはファイルのパスを指定するだけ。ここではaaa.txtを読み込んでいます。aaa.txtはプログラムファイルが存在するフォルダに置いておいてください。
場所は(プロジェクトのフォルダ)¥bin¥Debugです。

StreamReaderに変換する

FileStreamオブジェクトだけを使う方法でデータを読み込むのは少し面倒なので、ここではStreamReaderを利用した方法で読み込みます。

FileStreamからStreamReaderに変換するのは少し特殊で、キャストを使うのではなく、インスタンスの生成(newを使って新しいオブジェクトを作る)の際にパラメータにFileStreamオブジェクトを入れて作ります。

※(中級者向け)正確にはFileStreamからStreamReaderに変換しているのではなく、StreamReaderは「Stream系のオブジェクトでテキスト形式のデータを取得する」補助クラスなので、StreamReader自体にStreamとしての機能は付いていません。

ファイルの中身を読み込む

 

StreamReaderクラスを使えば、ReadToEndメソッドで全てのデータを一気に引っこ抜くことができます。

ここでは、引っこ抜いたデータをそのままコンソールに表示させているのです。

ReadToEndメソッドはパラメータ不要で、戻り値はstring型の命令です。

ストリームを閉じる(ファイルを閉じる)

プログラムが終了したら必ずストリームを閉じるようにしましょう。

ストリームは何か指定しない限り、他のプログラムから開くことができなくなります。(ファイルがロックされます)

そのため、プログラムが起動中、そのファイルにそのプログラムからだけしかアクセスできないのはあまりよろしくありません。

なので一通り用事が終わったらCloseで閉じるようにしましょう。

※StreamReaderはFileStreamの補助をしているだけなので、大元のStreamをCloseすればStreamReaderも自動的にCloseされます。もちろん、StreamReaderからCloseしても、大元のStreamもCloseされます。

余談

ファイルはテキスト形式とは限らない

今回、StreamReaderクラスを使ったのは、読み込むファイルがテキスト形式だと仮定したからです。バイナリファイルなど、0と1で構成されるような人間にはわからないファイルを読み込むのは、文字列しか扱えないStreamReaderで扱うには不向きです。

この場合、バッファを用意して読み込む必要があるのですが、使う機会はあまりないのでこちらでは割愛します。

StreamReaderから直接ファイルを読み込める

今回書いたコードは少し遠回りなコードです。本当はStreamReaderだけでもStreamを開くことができます。

読み込むファイルがテキスト形式とわかっている場合はこちらを使うのも手です。

1行ずつ読み込むこともできる

サンプルでは触れていませんが、わざわざ一気に読み込まなくても、1行ずつ読み込む方法もあります。

こんな感じ。Consoleと似てますね。

基本的にプログラミングで1行ずつ読み込む時はReadLineメソッドが使われます。もし、ファイルの容量が大きいとReadToEndメソッドではプログラムが固まってしまうかもしれません。その際にはReadLineメソッドとループを組み合わせて使うのも手かもしれません。

読み込み位置が一番最後か確認する

先ほど、1行ずつ読み込めるとありましたが、自分が今読み込んでいる位置が一番最後か確認する手段もあります。

その方法は2つあって、EndOfStreamプロパティを参照する方法、またはPositionプロパティとLengthプロパティで確認する方法です。

まあ基本的にはEndOfStreamプロパティでどうにかなるでしょう。