目次> 第14章> 14.2 TOPUPPREVNEXT

14.2 テキストの入力

文字列の詰まったファイルをテキスト・ファイルといいます。 エディタで作成するファイルはテキスト・ファイルです。 Javaプログラムでテキスト・ファイルを読んでみましょう。

ファイルを読む手順は次の通りです。

  1. 読みたいファイルの名前を指定してストリームを生成する。
    new FileReader( ファイル名 )
  2. ストリームをバッファリングする新たなストリームを生成する。
    new BufferedReader( ストリーム )
  3. ストリームから必要回数読み込みをおこなう。
    ストリーム.read()
    あるいは、
    ストリーム.readLine()
  4. ストリームを閉じる。
    ストリーム.close()
テキストファイルは、文字の列が行単位につながったものです。 行の区切りを気にせずに読む場合には read を使います。 行の区切りを頼りに処理をする場合には readLine が便利です。 ファイルの終わりに到達し、もう文字が残っていない場合、 read の場合は負の値が返されます。 readLine の場合は null が返されます。

【例1】

ファイルの先頭の10文字を読み込んで表示するプログラム。

10文字なので、バッファリング(上記のステップ2)を省略しましょう。
for 文で10回 read します。

プログラム First10Characters.java
行番号つき html ファイル

実行結果
First10Characters-1.gif

入出力をするプログラムが見た目に複雑に見えるのは、 try 文の中に書くためです。
try 文を使って、 指定したファイルが無かった場合や ファイルが読めなかった場合などの処理を明示しなければいけません。

try 文は7行目から21行目までです。 try の後ろのブロック(7〜17行目)が、 ファイルを読んだり処理したりする部分です。
17〜18行目と19〜21行目はcatch 句と呼ばれ、 それぞれ、ファイルが見つからなかった場合の処理、 入出力ができなかった場合の処理を記述します。

11行目で1文字読んで、12行目で表示しています。 読む文字は、int 型の変数に代入し、 負であればファイルの終わりなのでループをぬけ出します。

このプログラムのバリエーションを2例掲げますが、とばして【例4】に進みましょう。

【例2】

ループを使わず、1回の read で10文字読む例

プログラム First10Characters2.java

実行結果
First10Characters2-1.gif

【例3】

先頭から読み込む文字数をコマンドラインから与える例

プログラム FirstNCharacters.java

実行結果
FirstNCharacters-1.gif

【例4】

ファイルを先頭から最後まで読んで表示をしてみましょう。

バッファリングをする「標準的な入力手順」です。 readLine を使って行単位によみ、1行ずつ表示します。

プログラム ReadLineDemo1.java

実行結果
ReadLine1Demo-1.gif

このプログラムは 行単位に文字を読むプログラムの雛形 です。 赤字の部分はそのまま利用できます。 青い部分はストリームの名前です。このままでもかまいませんし、他の名前にしてもかまいません。 黒い部分は、処理に応じて書き換える部分です。
水色の部分はファイルの終わりを判定している部分で、 読んだ文字列が null かどうか判定が必要です。

簡単に言えば、11行目から24行目が雛形で、 自分のやりたいことを17行目の部分に書き込むだけ、ということになります。

11行目、20〜24行目

例外処理を行う部分。 ファイルが読めない場合の処理を記述します。
try の後の中カッコのなか(12〜19行目)で、 FileNotFoundException が発生した場合には21行目を、 IOException が発生した場合には、23行目を実行して、 try 文 の外(25行目) にぬけ出します。

12〜13行目

ファイル名を指定して、ストリームを生成します。
カレント・ディレクトリにある "data1.txt" という Shift_JIS のテキスト・ファイルから、 Unicode の文字列が次々に読み出せるようなストリームを生成し、 reader という名前をつけました。
給水配管が設置され、いつでもお湯が出てくる状態になったといったイメージです。

14〜18行目

読み込みと処理。
readLine メソッドで1行ずつ読み込んで、 println メソッドで表示しています。 読んだ行が null の場合(ファイルの終わりなので)、 ループをぬけ19行目に行きます。

19行目

ストリームを閉じます。

【例5】

雛形を応用して、テキスト・ファイルの行数と文字数を数えて見ましょう。

プログラム ReadLineDemo2.java

実行結果
ReadLineDemo2-1.gif

行番号つきプログラム・リスト (雛形に手を加えた部分を太字で示しています)。


更新日:2006-03-07 TOPUPPREVNEXT