如何在Java中使用多个Scanner对象来读取System.in的输入?

9

在我的程序中,如何正确地使用多个Scanner对象?

例如,我使用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个回答

14
我做错了什么?
在同一流上使用多个扫描器是潜在的问题。扫描器可以(而且会)消耗流 - 这可能会导致意外的副作用。最好不要这样做。
如果输入被关闭,则对于所有人来说,输入(但字符串没有close方法)都已关闭 - 对任何人来说都不太有趣。
编辑:
关于为什么多个扫描器不好的“详细信息”:
不要在单个字节或字符流上创建多个缓冲包装器 任何缓冲包装器都是不安全的;如果使用扫描器,则也可以利用此条件。

损坏的链接看起来应该是 --> https://www.securecoding.cert.org/confluence/display/java/FIO06-J.+不要在单个字节或字符流上创建多个缓冲包装器 - jacobq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接