東大ニート

東大卒のニートが勉強したことをメモするブログ

<Java> FileReaderクラスの使い方

以前、Javaでの入力処理を行うために、Scannerクラスの使い方についてScannerクラスの使い方(その1:基本編)で書きました。

他の入力処理としてBufferedReaderクラスの使い方を書こうと思ったのですが、今回はBufferedReaderクラスの基本となるFileReaderクラスの使い方を書いてみます。

JavaDriveさんの記事を参考にさせていただきました。

www.javadrive.jp

 

FileReaderクラスの特徴

最も大きな特徴は読み込みが1文字ずつになるということだと思います。

まとめて読み込むためにはBufferdReaderクラスを使用しますが、BufferdReaderクラスを使用するためには、FileReaderクラスが必要になるので、今回はFileReaderクラスから勉強します。

 

FileReaderインスタンスを作成し、ファイル情報を渡すまで

コードは以下のようになります。

Fileクラスの使い方については、Scannerクラスの使い方(その2:File編)をご参照ください。

  1. import java.io.File;

  2. import java.io.FileReader;

  3. import java.io.FileNotFoundException;

  4.  

  5. public class Main {

  6.        public static void main(String args) {

  7.               try{

  8.                      File f = new File("test.txt");

  9.                      FileReader fr = new FileReader(f);

  10.               }catch(FileNotFoundException e){

  11.                      System.out.println(e);

  12.               }

  13.        }

  14. }

 ポイント1. FIleReaderクラスのインポート(2行目)

まず、java.ioパッケージに含まれるFileReaderクラスをインポートします。
「import java.io.FileReader;」を記述します。まとめて「import java.io.*;」でも大丈夫です。

ポイント2. FileReaderインスタンスの作成(9行目)

FileReaderインスタンスを作成し、Fileインスタンス「f」を引数として渡します。

記述は「FileReader fr = new FileReader(f);」のようになります。

これでFileReaderインスタンス「fr」にソースファイルの全入力情報が渡されます。

 

FileReaderインスタンスからの読み込みとclose(readメソッド・closeメソッド)

FileReaderインスタンスから文字を読み込む時は、「read」メソッドを使用します。

以下に入力例・コード例・出力例を記載します。

入力例
AB CD
12 E
コード例
  1. import java.io.File;

  2. import java.io.FileReader;

  3. import java.io.FileNotFoundException;

  4. import java.io.IOException;

  5.  

  6. public class Main {

  7.        public static void main(String args) {

  8.               try{

  9.                      File f = new File("test.txt");

  10.                      FileReader fr = new FileReader(f);

  11.                      int a;

  12.                      while((a = fr.read()) != -1){

  13.                             System.out.println((char)a);

  14.                      }

  15.                      fr.close();
  16.               }catch(FileNotFoundException e){

  17.                      System.out.println(e);

  18.               }catch(IOException e){

  19.                      System.out.println(e);

  20.               }

  21.        }

  22. }

出力例
A
B
 
C
D


1
2
 
E

ポイント1. IOExceptionクラスのインポートとtry-catch(4・18・19行目)

readメソッドを使用するときは、読み込めなかった時の例外処理に対応するためにIOExceptionクラスをインポートします。

java.ioパッケージに含まれるため、「import java.io.IOException;」を記述します。まとめて「import java.io.*;」でも大丈夫です。

try-catchの処理はFileNotFoundExceptionと同様に18・19行目のように記載します。

ポイント2. readメソッドの使用(11〜13行目)

前述したようにreadメソッドでは文字を1文字ずつ読み込みますが、読み込んだ各文字は文字コードを表す整数として取得されます。

そのため、readメソッドで読み込んだ文字を取得する時は、int型で受け取るようにします。取得した値を再び文字に戻す場合は、char型にキャスト(型の変換)します。

上のコードではint型の「a」にreadの結果を入れるため「a = fr.read()」(12行目)と記述しています。またchar型へのキャストは「(char)a」(13行目)と記述しています。

ポイント3. ファイルの最後まで読み込む(12〜14行目)

readメソッドを使うと、まずファイルの先頭にある1文字を読み込みます。そして自動的に読み込む位置が次の文字に移ります。

そのため、連続してreadメソッドを使うと、ファイルの先頭から順に1文字ずつ読み込みます。そしてファイルの最後に達した時に「-1」という値を返してくれます。

ファイルの最後まで読み込む場合は、連続してreadメソッドを使用し、「-1」が返ってきた時に処理をやめればよいです。whileループを使用し、readの結果が-1とならない間は処理を行います。

コードは12行目の「while ( (a = fr.read() ) != 1 {」のように記述します。

ポイント4. FileReaderインスタンスのclose(15行目)

FIleReaderインスタンスに対する全ての処理が終わったら、閉じておく必要があります。「close」メソッドを使用し、「fr.close();」のように記述します。

 

次回はBufferedReaderクラスについて書いてみます。