我有Scanner
与System.in
相关联。现在,在使用Scanner
之后,我应该关闭它,因为将它打开是不好的编码习惯。但是,如果我关闭Scanner
,我也将关闭System.in
!任何人都可以告诉我如何关闭Scanner
而不关闭System.in
(如果有任何方式)。
答案 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的一个实例,你不必担心关闭()正在被召唤。