System.in
から何かを読み取る簡単なメソッドreadIn()
を作成しようとしています。 (System.console()
はEclipseで実行するとnullを返すため、コンソールを使用できません)。アイデアは、ここでは、このclose()は入力ストリームを完全に閉じます
classs Foo{
public static void(String[] arg){
String first = readIn("First, please");
System.out.println(first);
String second = readIn("Second, please");
System.out.println(second);
}
}
のように、必要に応じてreadIn
を呼び出すことですreadIn()
の最も単純な形式である:
static String readIn(String prompt){
System.out.println(prompt + ": ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
br.close(); // PROBLEM STATEMENT
return line;
}
私はbr.close()
文を省略した場合、それが正常に動作します - 私は繰り返しreadIn
を呼び出すことができます。しかし、私が閉じるべきであるbr
を閉じると、最初の呼び出しだけが動作します。 2回目の呼び出しではIOException: Stream closed
がスローされます。予想されるように、同じことがreadIn
でのtry-と資源で起こる:
static String readIn(String prompt){
System.out.println(prompt + ": ");
String line;
try(
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)) )
{
line = br.readLine();
}
return line;
}
同じことがScanner(System.in)
の代わりBufferedReader
で発生します。ファイルから読み込むときは起こりません。
readIn
を呼び出すたびに新しいBufferedReader
またはScanner
が作成されると、どちらのストリームが閉じられるのですか?これは何か約close(
)は、 "基礎となる読み取り/閉じる"(System.in)を閉じますか?再開できますか?理解しようとしています、ありがとう。
はい、基になるリソースを閉じます。これはJavadocで明確に述べられています。 BufferedReaderまたはScannersの作成とクローズは、読み取りごとに続けてはいけません。基本となるリソースの存続期間に同じものを使用する必要があります。 – EJP
OK。基本となるSystem.inリソースの寿命は何ですか? JVMの実行と同じですか? – user3501758
それは自発的に閉ざされません。 – EJP