はじめに
・標準入力でお世話になるInputStreamReader(System.in)
について
・一度閉じた標準入力ストリームを開こうとすると、閉じたまま開かない
一度閉じた標準入力ストリームは開けない?
コンソールから何か入力するときにお世話になる標準入力ストリームですが、どうやら同一プログラムのなかで一度閉じた標準入力ストリームは開けないっぽい。
例えば、
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
public static void main(String[] args) {
try {
// 2回目に入るとSystem.inが閉じたままになっている
for (int i = 0; i < 2; i++) {
streamTest1();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* コンソールに標準入力された文字列をそのまま返す
* @throws IOException
*/
private static void streamTest1() throws IOException {
try (BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in))) {
System.out.print("入力 >");
String st = br1.readLine();
System.out.println("出力 >" + st);
}
}
}
これを実行しようとすると
streamTest1
内のString st = br1.readLine();
の行で
java.io.IOException: Stream closed
と返されて、標準入力ストリームが閉じたままになってしまっていることがわかった。
今のところの解決法
自分が手を出せる範囲では、同一プログラム内で標準入力ストリームを複数使う場合は、最後にストリームを使った後に閉じるようにするくらいしか思いつかない。すなわち、
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
public static void main(String[] args) {
try {
streamTest1();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* コンソールに標準入力された文字列をそのまま返す
*
* @throws IOException
*/
private static void streamTest1() throws IOException {
// 繰り返しの上位ブロックにtry-with-resources文を持ってくる
try (BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in))) {
int i = 0;
while (i < 2) {
System.out.print("入力 >");
String st = br1.readLine();
System.out.println("出力 >" + st);
i++;
}
}
}
}
のようにすれば、繰り返し標準入力ストリームを使うことができる。
まとめ
・一度閉じた標準入力ストリームをまた開いて使おうとすると、閉じたままになっていて使えない。
・とりあえず標準入力ストリームを閉じるのは、最後にストリームを使用した後にすること。
...閉じてまた使う方法とかもありそうだなぁ。。