web-dev-qa-db-ja.com

Scanner.close()は何をしますか?

次のサンプルコードがあるとします。

Scanner scan1 = new Scanner(System.in);    // declaring new Scanner called scan1
int x = scan1.nextInt();    // scan for user input and set it to x
System.out.println(x);    // print the value of x
scan1.close();    // closes the scanner (I don't know exactly what this does)
Scanner scan2 = new Scanner(System.in); // declaring new Scanner called scan1
int y = scan2.nextInt();    // scan for user input and set it to y
System.out.println(y);    // print the value of y

Scannerクラスに関するOracleのドキュメント を読んで、これに出くわしました。

スキャナーを閉じると、ソースがCloseableインターフェイスを実装している場合、スキャナーは入力ソースを閉じます。

これは、(System.inの)Scannerが閉じられると、Javaプログラム全体でSystem.inを使用できなくなることを意味しますか? ?それとも、クラス全体で使用できなくなるということですか?それともメソッドだけですか?それともそのスコープだけですか?

私が持っているもう1つの質問は、スキャナーが宣言されたスコープに制限されているか(プリミティブデータ型と同様)ですか?

12
Kootling

はい、それは_System.in_が閉鎖されることを意味します。テストケース:

_import Java.util.*;

public class CloseScanner {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        scanner.close();
        System.in.read();
    }
}
_

このコードはで終了します

_$ Java CloseScanner 
Exception in thread "main" Java.io.IOException: Stream closed
    at Java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.Java:162)
    at Java.io.BufferedInputStream.fill(BufferedInputStream.Java:206)
    at Java.io.BufferedInputStream.read(BufferedInputStream.Java:254)
    at CloseScanner.main(CloseScanner.Java:7)
_

閉じられると、プログラムの残りの部分で_System.in_を使用できなくなります。 close()が渡されるという事実は、後で閉じることができるように入力ストリームへの個別の参照を維持する必要がないことを意味するため、素晴らしいです。次に例を示します。

_scanner = new Scanner(foo.somethingThatMakesAnInputStream());
_

これを実行し、スキャナーで.close()を呼び出して、基になるストリームを閉じることができます。

ほとんどの場合、_System.in_を閉じたくないので、その場合は.close()を呼び出したくないでしょう。

6
FatalError