ShowFile1.java の変更

前期の科目「オブジェクト指向プログラミングおよび演習」の教科書 第18章「ファイル操作と入出力、クラスの調べ方」 の 1つ目のサンプルプログラム 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.*;  // URI, URL, URLConnection クラスの属するパッケージ
...
            // URLオブジェクトを生成
            URL url = new URI("https://www.w3.org/").toURL();
            // URLオブジェクトから、接続にいくURLConnectionオブジェクトを取得
            URLConnection connection = url.openConnection();
            // 接続
            connection.connect();
            // サーバからやってくるデータをInputStreamとして取得
            InputStream inputStream = connection.getInputStream();

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

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

import java.io.*;
import java.net.*;  // URI, 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 URI("https://www.w3.org/").toURL();
            // 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 (URISyntaxException e) {  // URIのコンストラクタが投げる例外
            System.out.println("URIの形式が不正です: " + e.getInput());
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}

ShowFile1.java

元のプログラムでは実行時に与える情報である配列 args を介してファイル名を与えていましたが、 ここでは簡単のため URL を直接ソースコードに記述しています。 配列 args の要素数を確認する if のブロックはコメントアウトしています。

ファイルを扱わなくなったので FileNotFoundException を catch するブロックを削除し、 URI のコンストラクタで発生する URISyntaxException を catch するブロックを追加しています。

ネットワーク接続時に発生する例外については IOException の一種として catch していますが、 例外の種類によって処理を変える場合には、より細分化された例外を catch するブロックを用意してください。