[英]Close a Scanner linked to System.in
我有一个链接到System.in
的Scanner
。 现在,在使用Scanner
,我应该关闭它,因为让它保持打开状态是不好的编码习惯。 但是,如果我关闭Scanner
,我也会关闭System.in
! 谁能告诉我如何在不关闭System.in
情况下关闭Scanner
(如果有任何办法)。
如果您不想关闭底层流,最简单的事情就是不要关闭 Scanner。
理想情况下,您应该只创建一个在程序生命周期中使用的扫描仪。 无论如何,您似乎没有充分的理由关闭它。
一种选择是将System.in
流包装在CloseShieldInputStream
,以防止它被关闭。 然后,您的读者将使用CloseShieldInputStream
而不是原始System.in
流。
这是该类的 API: http : //commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html
而不是添加屏蔽类和类似的东西,只需添加一个很好的评论和
@SuppressWarnings("resource")
这已经足够了。 而且我似乎没有看到这种方法有很多缺点。 不要忘记评论。
很久以前,我对使用System.in
的同一个Scanner
两次有一些奇怪的、无法诊断的问题的模糊记忆,所以这就是我使用的(即使你可能应该在程序运行期间只使用一个扫描仪):
static String input() {
try {
return new Scanner(System.in).nextLine();
} catch (NoSuchElementException e) {
throw e;
}
}
出于某种原因,这可以在没有警告的情况下工作,而如果我不进行 catch-throw,Eclipse 会抱怨Resource leak: '<unassigned Closeable value>' is never closed
。
根据InputSteam的API “InputStream 的 close 方法什么都不做。”,因此由于 System.in 是 InputStream 的实例,因此您无需担心 close() 会被调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.