如何在System.in上使用多个Scanner对象?

时间:2010-11-20 11:58:36

标签: java inputstream java.util.scanner

在我的程序中使用多个Scanner对象的正确方法是什么。例如,我使用扫描仪来读取文件,然后根据文件中的内容,我再次使用扫描仪来提示用户输入。我的代码摘录显示

....
Scanner f = new Scanner (System.in); //get the file name
String fileName = f.next();
Scanner input = new Scanner( new File( fileName ) );
while ( input.hasNext() )
{
   String currentLine = input.nextLine();
   if ( some pattern found) {
       Scanner getUserInput = new Scanner (System.in);
       String userInput = getUserInput.next();
       .....
   }
}
....

它似乎不起作用。我需要使用userInput.close()吗?我究竟做错了什么。 ?

我不明白的是,第一个System.in只是获取文件名。在那之后,为什么它会干扰第二个System.in。 对于input对象,它从文件中读取而不是从System.in读取。

1 个答案:

答案 0 :(得分:11)

  

我做错了什么?

在同一个流上使用多个扫描程序是潜在的问题。扫描仪可以(并且将会)消耗流 - 这可能(将)导致意外的副作用。最好不要这样做。

如果输入已关闭,则输入​​(但字符串没有close方法)对所有人都是关闭的 - 这对任何人来说都不是很有趣。

编辑“详情”了解多个扫描程序错误的原因:Do not create multiple buffered wrappers on an InputStream

  

...任何缓冲的包装都不安全;如果使用扫描仪,这种情况也可以利用......

另见Java code question ... scanner related?,其中也讨论了一些方法。