前期の科目「オブジェクト指向プログラミングおよび演習」の教科書 第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); } } }
元のプログラムでは実行時に与える情報である配列 args を介してファイル名を与えていましたが、 ここでは簡単のため URL を直接ソースコードに記述しています。 配列 args の要素数を確認する if のブロックはコメントアウトしています。
ファイルを扱わなくなったので FileNotFoundException を catch するブロックを削除し、 URI のコンストラクタで発生する URISyntaxException を catch するブロックを追加しています。
ネットワーク接続時に発生する例外については IOException の一種として catch していますが、 例外の種類によって処理を変える場合には、より細分化された例外を catch するブロックを用意してください。