说我有以下示例代码:
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
我读了Oracle documentation on the Scanner
class并发现了这个:
当扫描仪关闭时,如果源实现了Closeable接口,它将关闭其输入源。
这是否意味着一旦Scanner
(System.in
)关闭,我将无法再在整个Java程序中使用System.in
?或者这是否意味着我将不再能够在整个班级使用它?还是只有方法?或者只是它的范围?
我遇到的另一个问题是,Scanner是否仅限于声明的范围(类似于原始数据类型)?
答案 0 :(得分:6)
是的,这确实意味着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()
。