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

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

.... 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读取。

我究竟做错了什么?

在同一个stream上使用多个扫描仪是潜在的问题。 扫描仪可以(也将会)消耗stream – 这可能(将)导致意想不到的副作用。 最好不要这样做。

如果input是closures的,那么input(但string没有close方法)是closures所有人 – 这对任何人都没有多less乐趣。

编辑:关于为什么多个扫描仪不好的“细节”: 不要在InputStream上创build多个缓冲包装

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

请参阅Java代码问题…扫描程序相关? 这也谈到了一些办法。