关闭链接到System.in的扫描程序

时间:2013-01-03 16:21:26

标签: java java.util.scanner

我有ScannerSystem.in相关联。现在,在使用Scanner之后,我应该关闭它,因为将它打开是不好的编码习惯。但是,如果我关闭Scanner,我也将关闭System.in!任何人都可以告诉我如何关闭Scanner而不关闭System.in(如果有任何方式)。

5 个答案:

答案 0 :(得分:23)

最简单的方法是,如果您不想关闭基础流,请不要关闭扫描程序。

理想情况下,您应该只创建一个用于程序生命周期的扫描仪。在任何情况下,您似乎都没有充分的理由将其关闭。

答案 1 :(得分:22)

一种选择是将System.in信息流包含在CloseShieldInputStream中,以防止其被关闭。然后,您的读者将使用CloseShieldInputStream而非原始System.in流。

以下是该课程的API: http://commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html

答案 2 :(得分:6)

不要添加盾牌类和类似的东西,只需添加一个好的评论和

        @SuppressWarnings("resource")

这很好。我似乎没有看到这种方法有很多缺点。不要忘记评论。

答案 3 :(得分:0)

我对很久以前使用相同Scanner System.in两次的奇怪的,不可识别的问题有模糊的记忆,所以这就是我使用的(即使你应该只使用一台扫描仪该计划):

static String input() {
    try {
        return new Scanner(System.in).nextLine();
    } catch (NoSuchElementException e) {
        throw e;
    }
}

出于某种原因,这可以在没有警告的情况下发挥作用,而如果我不做引人注目的话,Eclipse会抱怨Resource leak: '<unassigned Closeable value>' is never closed

答案 4 :(得分:-5)

根据API for InputSteam&#34; InputStream的close方法什么都不做。&#34;,所以既然System.in是InputStream的一个实例,你不必担心关闭()正在被召唤。