19. Readerクラス

文字をあつかう入力ストリームです。文字コード変換を自動で行います。

(1) テキストファイルを読み込む

 Writer クラスとは逆の操作をするのが Reader クラスです。テキストファイルにテストデータを用意して、読み込ませながら処理をしたい場合などに使うと便利です。

 ここではまず、ファイルから読み込みをするクラスを紹介します。java.io.FileReader というクラスです。よく使うコンストラクタは次の2つです。
FileReader(File file) throws FileNotFoundException
FileReader(String fileName) throws FileNotFoundException

 FileReader の read( ) メソッドを使うと読み込みができますが、もっと使いやすくするために、この FileReader にフィルタをかけるような使い方をしてみます。

 そこでよく使われるクラスが java.io.BufferedReader というクラスです。このクラスでフィルタをかけると改行までの1行をまとめて読み込むという使い方ができます。BufferedReader のコンストラクタは以下のとおりです

BufferedReader(Reader in)

 引数には Reader クラスのオブジェクトを指定するので、先の FileReader オブジェクトを指定すればファイルからの読み込みが可能です。BufferedReader を使って1行分の読み込みをするには、

String readLine( )

 というメソッドを使います。データの終端までいくと null を返します。

  WriterTest.java

import java.io.*;

class ReaderTest {
    public static void main(String args[]) {
        try {
            FileReader fr = new FileReader("readtest.txt");
            BufferedReader in = new BufferedReader(fr);
            String str;
            while (true) {
                str = in.readLine();
                if (str==null) break;
                System.out.println(str); 
            }
            fr.close();
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


 テスト用に用意したテキストファイル readtest.txt

1行目
second line
3GYOUME


 実行方法

C:\java_test>java ReaderTest
1行目
second line
3GYOUME


(2) scanf( ) みたいなことがしたい

 アプリケーションプログラムを作るとき、コマンドラインから値を入力したい場合があります。Javaの標準入力は System.in で与えられるので、DataInputStream クラスのコンストラクタに System.in を与えれば標準入力からの読み込みが可能です。

 System.in は System クラスの in という変数で、これは InputStream クラスのオブジェクトです。

 ですが、普通は先に紹介した BufferedReader クラスを利用して標準入力からの入力を受け付けます。ただ、ここで問題になるのは BufferedReader クラスのコンストラクタの引数には Reader クラスのオブジェクトを指定しなければならないということです。

 そこで登場するクラスが java.io.InputStreamReader というクラスです。このクラスはバイト単位のデータを扱うストリームと文字を扱うストリームの橋渡しをします。ですから、
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader( isr );

 とすれば、標準入力からの読み込みができます。BufferedReader を使っているので readLine() で1行分まとめて読み込みができます。

  Stdin.java

import java.io.*;

class StdinTest {
    public static void main(String args[]) {
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader in = new BufferedReader(isr);
            String str;
            while (true) {
                System.out.print("何か入力して Enter を押します > ");
                str = in.readLine();
                if (str==null) break;
                System.out.println( "--- "+str );
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


 実行方法

C:\java_test>java StdinTest
何か入力して Enter を押します > Java Java Java
--- Java Java Java
何か入力して Enter を押します > 1234567890
--- 1234567890
何か入力して Enter を押します >

 終了する場合は CTRL+Z を入力すると終了します。読み込んだデータは String 型なので、これを数値として扱いたい場合は、入門編21章で紹介したようなラッパークラスを使い変換します。
前の章(18.Writerクラス)   次の章(20.スレッド)