【问题标题】:What does scanner.close() do?scanner.close() 有什么作用?
【发布时间】:2014-12-02 10:31:35
【问题描述】:

假设我有以下示例代码:

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 并遇到了这个:

当 Scanner 关闭时,如果源实现了 Closeable 接口,它将关闭其输入源。

这是否意味着一旦ScannerSystem.in)关闭,我将无法再在整个 Java 程序中使用System.in?或者这是否意味着我将不再能够在整个课堂上使用它?还是只有方法?还是只有它的范围?

我的另一个问题是,Scanner 是否仅限于声明它的范围(类似于原始数据类型)?

【问题讨论】:

标签: java java.util.scanner


【解决方案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.inclose() 被传递的事实很好,因为这意味着您不必维护对输入流的单独引用,以便稍后关闭它,例如:

scanner = new Scanner(foo.somethingThatMakesAnInputStream());

您可以这样做并在扫描仪上调用.close() 以关闭底层流。

在大多数情况下,您不想关闭System.in,因此在这种情况下您也不想调用.close()

【讨论】:

  • +1 仅用于使用测试用例进行尝试,从而避免陷入猜测和理论化的陷阱。
  • 我明白了,所以澄清一下,如果我在任何方法(即调用)的 for 循环中使用 scanner.close() 上的 System.in,我将无法在任何方法中使用它我的程序中有哪些课程?
  • 一旦关闭,它就关闭了——我不知道有什么方法可以重新启动它,尽管我不知道这是不可能的(但这肯定是不寻常的)
  • 不,我说关闭后就不能再打开了。也许我不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2011-07-17
  • 2014-09-13
  • 2011-12-30
  • 1970-01-01
  • 2019-04-26
  • 2016-04-29
相关资源
最近更新 更多