次のサンプルコードがあるとします。
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つの質問は、スキャナーが宣言されたスコープに制限されているか(プリミティブデータ型と同様)ですか?
はい、それは_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()
を呼び出したくないでしょう。