ShowFile1.java の変更

教科書のサンプルプログラム ShowFile1.java は、 プログラムの実行時にコマンドライン引数でファイル名を指定し、 そのファイルを入力ストリームとして扱い、そこから 1行ずつ読み込み画面に表示するものでした。

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

import java.io.*;
public class ShowFile1 {
    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("使用法:java ShowFile1 ファイル");
            System.out.println("例:java ShowFile1 ShowFile1.java");
            System.exit(0);
        }
        String filename = args[0];
        try {
            BufferedReader reader = new BufferedReader(new FileReader(filename));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (FileNotFoundException e) {
            System.out.println(filename + "が見つかりません。");
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}

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

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

            BufferedReader reader = new BufferedReader(new FileReader(filename));

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

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

3行になりましたが、ファイルから入力ストリーム(InputStream)を用意する1行目を変更すれば、ファイル以外のものも読み込めるようになります。 なお、読み込むファイルの文字コード(ここでは仮に UTF-8)を指定します。

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

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

この部分は例外を発生するため、try ブロックの内部に記述する必要があります。

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

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

public class ShowFile1 {
    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("使用法:java ShowFile1 ファイル");
            System.out.println("例:java ShowFile1 ShowFile1.java");
            System.exit(0);
        }
        //String filename = args[0];
        try {
            // URLオブジェクトを生成
            URL url = new URL(args[0]);
            // URLオブジェクトから、接続にいくURLConnectionオブジェクトを取得
            URLConnection connection = url.openConnection();
            // 接続
            connection.connect();
            // サーバからやってくるデータをInputStreamとして取得
            InputStream inputStream = connection.getInputStream();
            // 次に inputStream を読み込む InputStreamReader のインスタンス inputStreamReader を生成
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
            // さらに inputStreamReader をラップする BufferedReader のインスタンス reader を生成
            BufferedReader reader = new BufferedReader(inputStreamReader);
            //BufferedReader reader = new BufferedReader(new FileReader(filename));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        //} catch (FileNotFoundException e) {
        //    System.out.println(filename + "が見つかりません。");
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}

ShowFile1.java

ファイルを扱わなくなったので、FileNotFoundException は発生しないためコメントアウトしています。 なお、URL クラスのコンストラクタなどで発生する例外は IOException を継承しているため、 新たな catch を用意しなくてもコンパイルは通ります。 もちろん、例外の種類によって処理を変える場合には独立の catch を用意することが必要です。