我有一个Scanner
链接到System.in
. 现在,在使用 之后Scanner
,我应该关闭它,因为让它保持打开状态是不好的编码习惯。但是,如果我关闭Scanner
,我也会关闭System.in
!谁能告诉我如何在不关闭的Scanner
情况下关闭System.in
(如果有的话)。
5 回答
如果您不想关闭底层流,最简单的方法是不要关闭 Scanner。
理想情况下,您应该只创建一个扫描仪,供您在程序的整个生命周期中使用。无论如何,您似乎没有充分的理由关闭它。
一种选择是将您的System.in
流包装在一个CloseShieldInputStream
防止它被关闭的中。然后,您的读者将使用CloseShieldInputStream
而不是原始System.in
流。
这是该类的 API: http: //commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html
而不是添加屏蔽类和类似的东西,只需添加一个很好的评论和一个
@SuppressWarnings("resource")
这已经足够了。而且我似乎没有看到这种方法有很多缺点。不要忘记评论。
我对很久以前使用两次相同的奇怪,无法诊断的问题有模糊的记忆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
。
根据InputSteam 的 API “InputStream 的 close 方法什么都不做。”,所以由于 System.in 是 InputStream 的一个实例,你不必担心 close() 被调用。