DisplayFile の変更

サンプルプログラム DisplayFile.java は、 ファイルである sample.txt を入力ストリームとして扱い、 そこから 1行ずつ読み込み画面に表示するものでした。

このプログラムの入力ストリームを用意する部分を変更すれば、ファイルではなく、 キーボードやWebサーバからのデータを扱うことができるようになります。

import java.io.*;

class DisplayFile {
    public static void main(String args[]) {
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader("sample.txt"));
        }
        catch (IOException e) {
            System.err.println("File cannot be opened.");
            System.exit(1); // ←終了コード 1 でプログラムを終了するメソッド
        }

        try {
            String str;
            str = in.readLine();
            while (str != null) {
                System.out.println(str);
                str = in.readLine();
            }
        }
        catch (IOException e) {
            System.err.println("An error was occured while reading.");
        }

        try {
            in.close();
        }
        catch (IOException e) {
            System.err.println("An error was occured while closing.");
        }
    }
}

このプログラムの入力ストリームを用意する部分を変更すれば、ファイルではなく、 キーボードやWebサーバからのデータを扱うことができるようになります。

このプログラムでは、ファイルから入力ストリームを用意し、 それを読み込むリーダーのオブジェクトを生成するところまで、 1行で書いてあります。

            in = new BufferedReader(new FileReader("sample.txt"));

ファイルから入力ストリームを用意するところが表に現れていませんが、 これは FileReader のコンストラクタが内部でそれをやってくれているからです。 FileReader を用いるのは簡略化したやり方で、 本来は次のような手順で入力ストリームとそれを読み込むリーダーを生成します。

            // まずファイル名を与えてFileInputStreamのインスタンスisを生成
            InputStream is = new FileInputStream("sample.txt");
            // 次にisを読み込むInputStreamReaderのインスタンスisrを生成
            InputStreamReader isr = new InputStreamReader(is, "UTF-8");
            // さらにisrをラップするBufferedReaderのインスタンスrを生成
            in = new BufferedReader(isr);

3行になりましたが、ファイルから入力ストリーム(InputStream)を用意する1行目を変更すれば、ファイル以外のものも読み込めるようになります。

Webサーバから送られてくるデータを入力ストリームにするには、 次のように記述します。

import java.net.*;  // URL, URLConnection クラスの属するパッケージ
...
            // URLオブジェクトを生成
            URL url = new URL(args[0]);
            // URLオブジェクトから、接続にいくURLConnectionオブジェクトを取得
            URLConnection connection = url.openConnection();
            // 接続
            connection.connect();
            // サーバからやってくるデータをInputStreamとして取得
            InputStream is = connection.getInputStream();

プログラム全体としては次のようになります。

import java.io.*;
import java.net.*;  // URL, URLConnection クラスの属するパッケージ

class DisplayFile {
    public static void main(String args[]) {
        BufferedReader in = null;
        try {
            // URLオブジェクトを生成
            URL url = new URL(args[0]);
            // URLオブジェクトから、接続にいくURLConnectionオブジェクトを取得
            URLConnection connection = url.openConnection();
            // 接続
            connection.connect();
            // サーバからやってくるデータをInputStreamとして取得
            InputStream is = connection.getInputStream();
            // 次にisを読み込むInputStreamReaderのインスタンスisrを生成
            InputStreamReader isr = new InputStreamReader(is, "UTF-8");
            // さらにisrをラップするBufferedReaderのインスタンスrを生成
            in = new BufferedReader(isr);
        }
        catch (IOException e) {
            System.err.println("File cannot be opened.");
            System.exit(1); // ←終了コード 1 でプログラムを終了するメソッド
        }

        try {
            String str;
            str = in.readLine();
            while (str != null) {
                System.out.println(str);
                str = in.readLine();
            }
        }
        catch (IOException e) {
            System.err.println("An error was occured while reading.");
        }

        try {
            in.close();
        }
        catch (IOException e) {
            System.err.println("An error was occured while closing.");
        }
    }
}