Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关闭链接到System.in的扫描仪_Java_Java.util.scanner - Fatal编程技术网

Java 关闭链接到System.in的扫描仪

Java 关闭链接到System.in的扫描仪,java,java.util.scanner,Java,Java.util.scanner,我有一个扫描仪链接到系统中。现在,在使用了扫描仪之后,我应该关闭它,因为让它保持打开状态是不好的编码实践。但是,如果我关闭扫描仪,我也将关闭系统!有人能告诉我如何在不关闭系统的情况下关闭扫描仪。(如果有任何方法)。如果您不想关闭底层流,最简单的方法就是不关闭扫描仪 理想情况下,您应该只创建一个在程序生命周期中使用的扫描仪。在任何情况下,您似乎没有很好的理由关闭它。一个选项是将您的系统包装在流中,以关闭屏蔽输入流阻止其关闭。然后,读者将使用CloseShieldInputStream而不是原始系统

我有一个
扫描仪
链接到
系统中。现在,在使用了
扫描仪之后,我应该关闭它,因为让它保持打开状态是不好的编码实践。但是,如果我关闭
扫描仪
,我也将关闭
系统!有人能告诉我如何在不关闭
系统的情况下关闭
扫描仪
(如果有任何方法)。

如果您不想关闭底层流,最简单的方法就是不关闭扫描仪


理想情况下,您应该只创建一个在程序生命周期中使用的扫描仪。在任何情况下,您似乎没有很好的理由关闭它。

一个选项是将您的
系统包装在
流中,以
关闭屏蔽输入流
阻止其关闭。然后,读者将使用
CloseShieldInputStream
而不是原始
系统.in

以下是该类的API:

不要添加屏蔽类之类的东西,只需添加一条漂亮的注释和

        @SuppressWarnings("resource")

这就够了。我似乎没有看到这种方法有很多缺点。不要忘记注释。

根据“InputStream的close方法不起任何作用”,因此,由于System.in是InputStream的一个实例,您不必担心它会被调用close()。

我对奇怪的,很久以前,使用
系统的相同
扫描仪时出现了无法诊断的问题。在
中,我使用了两次,所以这就是我所使用的(即使您可能只需要在程序期间使用一台扫描仪):


出于某种原因,这在没有警告的情况下工作,而如果我不执行catch抛出,Eclipse将抱怨
资源泄漏:''从未关闭

,希望这对您有用。我还在看System.in是否实现可关闭。如果没有,你就没有问题了。请注意,你可以用一个.yes,System.in来保护流。@pauljerman
System.in
是一个
InputStream
,因此实现了
AutoClosable
,请参见。“医生,我这样做很痛!”。。。“那么就不要这样做。”您还可以为系统创建自己的自定义不可关闭包装器。如果我在
系统上打开
扫描仪
,在
中,关闭它,然后打开另一个,然后尝试使用它(例如
nextLine()
),我会得到
NoSuchElementException
。而
close()
在抽象
输入流的默认实现中确实没有任何作用,这并不意味着它的所有子类都是如此!如果这是真的,那么该方法将毫无用处。
InputStream
是一个抽象类。当子类表示在使用后需要关闭的资源(如stdin)时,它们可以并且应该“做一些事情”。当然,在
InputStream.close()
中可以更清楚地说明这一点,但您的结论是错误的。这个答案完全错误,我认为需要删除它。通过要求代码知道它正在与系统进行通信,或者至少是不应该关闭的内容,这一点是有效的。Paul Jermans的
CloseShieldInputStream
建议允许代码忽略这一事实,并简单地将其视为任何其他InputStream,并在完成时尝试关闭它。这里的简单实际上取决于上下文。@candid_orange您不应该关闭一个您不拥有的流(鉴于Java中缺乏强烈的所有权概念,这大致意味着您没有打开)。如果您是从其他地方获得流的,请不要关闭扫描仪。@AndyTurner,它可以工作。如果您希望遵循该规则,并且仍然可以自由地广泛使用,请在此处查找,您只是通过混淆Eclipse代码分析来避免警告:)扫描仪仍然没有关闭(不是您应该:)?这可能会抑制警告,但不会阻止您在尝试使用
系统时获得
IOException:Stream closed
Scanner@derHugo我想他们的意思是不要关闭扫描仪,用注释和添加解释性注释来抑制有关警告。
static String input() {
    try {
        return new Scanner(System.in).nextLine();
    } catch (NoSuchElementException e) {
        throw e;
    }
}