如何在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代码问题…扫描程序相关? 这也谈到了一些办法。