我有一个与System.in
相关联的Scanner
。现在,在使用完Scanner
后,应该关闭它,因为将其保持打开状态是糟糕的编码实践。但是,如果我关闭Scanner
,也会关闭System.in
! 有人可以告诉我如何在不关闭System.in
的情况下关闭Scanner
吗(如果有任何方法)。
我有一个与System.in
相关联的Scanner
。现在,在使用完Scanner
后,应该关闭它,因为将其保持打开状态是糟糕的编码实践。但是,如果我关闭Scanner
,也会关闭System.in
! 有人可以告诉我如何在不关闭System.in
的情况下关闭Scanner
吗(如果有任何方法)。
如果您不想关闭底层流,请不要关闭Scanner,这是最简单的方法。
理想情况下,您应该只创建一个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;
}
}
出于某种原因,如果我不使用catch-throw,Eclipse会抱怨资源泄漏:'<未分配的可关闭值>'从未关闭
,而使用它却没有警告。
System.in
上打开一个Scanner
,关闭它,然后再打开另一个并尝试使用它(例如nextLine()
),我会得到NoSuchElementException
。 - H.v.M.InputStream
的默认实现中,close()
方法确实不起作用,但并不意味着所有子类也是如此!如果这是真的,那么这个方法就没有用处了。 - Jiri TousekInputStream
是一个抽象类。当其子类表示需要在使用后关闭的资源(如 stdin)时,它们可以和应该执行“某些操作”。虽然 InputStream.close()
可能需要更清晰的说明,但你的结论是不正确的。 - dimo414
System.in
是一个InputStream
,因此实现了AutoClosable
,请参阅文档。 - jlordo