1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

一度閉じた標準入力ストリーム(System.in)について

Posted at

はじめに

・標準入力でお世話になる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++;
			}
		}
	}
}

のようにすれば、繰り返し標準入力ストリームを使うことができる。

まとめ

・一度閉じた標準入力ストリームをまた開いて使おうとすると、閉じたままになっていて使えない。
・とりあえず標準入力ストリームを閉じるのは、最後にストリームを使用した後にすること。

...閉じてまた使う方法とかもありそうだなぁ。。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?