2016-10-24 10 views
-3

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)を閉じますか?再開できますか?理解しようとしています、ありがとう。

+8

はい、基になるリソースを閉じます。これはJavadocで明確に述べられています。 BufferedReaderまたはScannersの作成とクローズは、読み取りごとに続けてはいけません。基本となるリソースの存続期間に同じものを使用する必要があります。 – EJP

+0

OK。基本となるSystem.inリソースの寿命は何ですか? JVMの実行と同じですか? – user3501758

+0

それは自発的に閉ざされません。 – EJP

答えて

0

br.close();また、システム入力ストリームSystem.inも閉じます。したがって、JVMを再起動しない限り使用できません。

System.out.println 
br.readLine(); 

彼らが異なるストリームに関連しているので、すべての問題があってはならない: あなたは、呼び出しを混合することも恥ずかしがらないでくださいSystem.in

から必要なすべての入力に対して同じBufferedReaderインスタンスを使用することができます。

関連する問題