43

我有一个Scanner链接到System.in. 现在,在使用 之后Scanner,我应该关闭它,因为让它保持打开状态是不好的编码习惯。但是,如果我关闭Scanner,我也会关闭System.in!谁能告诉我如何在不关闭的Scanner情况下关闭System.in(如果有的话)。

4

5 回答 5

30

如果您不想关闭底层流,最简单的方法是不要关闭 Scanner。

理想情况下,您应该只创建一个扫描仪,供您在程序的整个生命周期中使用。无论如何,您似乎没有充分的理由关闭它。

于 2013-01-03T16:32:35.693 回答
26

一种选择是将您的System.in流包装在一个CloseShieldInputStream防止它被关闭的中。然后,您的读者将使用CloseShieldInputStream而不是原始System.in流。

这是该类的 API: http: //commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html

于 2013-01-03T16:32:35.893 回答
10

而不是添加屏蔽类和类似的东西,只需添加一个很好的评论和一个

        @SuppressWarnings("resource")

这已经足够了。而且我似乎没有看到这种方法有很多缺点。不要忘记评论。

于 2014-07-06T09:09:32.857 回答
0

我对很久以前使用两次相同的奇怪,无法诊断的问题有模糊的记忆ScannerSystem.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

于 2015-11-06T18:15:42.223 回答
-8

根据InputSteam 的 API “InputStream 的 close 方法什么都不做。”,所以由于 System.in 是 InputStream 的一个实例,你不必担心 close() 被调用。

于 2015-11-06T08:44:18.033 回答