教科書のサンプルプログラム 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); } } }
ファイルを扱わなくなったので、FileNotFoundException は発生しないためコメントアウトしています。 なお、URL クラスのコンストラクタなどで発生する例外は IOException を継承しているため、 新たな catch を用意しなくてもコンパイルは通ります。 もちろん、例外の種類によって処理を変える場合には独立の catch を用意することが必要です。