closures与System.in链接的扫描仪

我有一个Scanner链接到System.in 。 现在,使用Scanner ,我应该closures它,因为打开它是不好的编码习惯。 但是,如果我closuresScanner ,我也将closuresSystem.in ! 谁能告诉我如何closuresScanner而不closuresSystem.in (如果有任何方法)。

一种select是将您的System.instream封装在一个CloseShieldInputStream ,以防止它被closures。 您的读者然后将使用CloseShieldInputStream而不是原始的System.instream。

以下是该类的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()被调用。