closures与System.in链接的扫描仪
我有一个Scanner
链接到System.in
。 现在,使用Scanner
,我应该closures它,因为打开它是不好的编码习惯。 但是,如果我closuresScanner
,我也将closuresSystem.in
! 谁能告诉我如何closuresScanner
而不closuresSystem.in
(如果有任何方法)。
一种select是将您的System.in
stream封装在一个CloseShieldInputStream
,以防止它被closures。 您的读者然后将使用CloseShieldInputStream
而不是原始的System.in
stream。
以下是该类的API: http : //commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html
最简单的事情是,如果你不想closures基础stream,就不要closures扫描器。
理想情况下,您应该创build一个您使用该程序的扫描仪。 无论如何,看起来你没有理由closures它。
不要添加盾牌类和类似的东西,只是把一个很好的评论和一个
@SuppressWarnings("resource")
这很好。 我似乎没有看到这种方法的很多缺点。 不要忘记评论。
对于使用同一个System.in
两次Scanner
,我早已模糊地记忆了一些奇怪的,不可知的问题,所以这就是我所使用的(即使您应该在程序期间使用一台扫描仪):
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()被调用。