提问人:mPierce 提问时间:3/22/2012 最后编辑:skaffmanmPierce 更新时间:9/25/2023 访问量:20891
Java Scanner 无法“完成”读取输入
Java Scanner won't "finish" reading input
问:
我在使用 java 的 Scanner 类时遇到了问题。我可以让它很好地读取我的输入,但问题是当我想输出一些东西时。给定多行输入,当所有输入都已完全读取时,我只想打印一行。这是我用于读取输入的代码:
public static void main(String[] args){
Scanner scanner = new Scanner(System.in); //scanner reads block of input
while(scanner.hasNextLine()){
//body of loop goes here
String s = scanner.nextLine();
Scanner ls = new Scanner(s); //scanner to parse a line of input
while(ls.hasNext()){
//body of nested loop goes here
ls.next();
}
}
System.out.println("Fin");
}
即使读取了所有输入行,程序也不会到达 System.out.println 消息。(请注意,消息不能发送到其他任何地方,否则它将在循环运行时输出多次)。我该如何解决这个问题?任何帮助将不胜感激。
答:
在本例中,您正在从无限流中读取。 如果此扫描仪的输入中有另一行,则将继续返回 true。由于它是 ,它将继续从键盘读取,除非您终止它或告诉流停止。hasNextLine()
System.in
最后按“ctrl+Z”,你会看到它有效。
编辑:你可以做这样的事情......
Scanner scanner = new Scanner(System.in); //scanner reads block of input
int BLOCK_SIZE =3,count=1;
while(scanner.hasNextLine()){
//body of loop goes here
String s = scanner.nextLine();
Scanner ls = new Scanner(s); //scanner to parse a line of input
while(ls.hasNext()){
//body of nested loop goes here
ls.next();
}
if(count++==BLOCK_SIZE)
{
break;
}
}
System.out.println("Fin");
}
评论
正如我在您使用的外部 while 循环中看到的那样
scanner.hasNextLine();
方法。如果必须等待输入,则此方法将被阻止。你也有
Scanner scanner = new Scanner(System.in);
陈述。因此,system.in 将一直等待输入,因此 hasNextLine() 方法必须等待输入。 这就是为什么控件卡在循环中并且无法继续的原因。
要修复它,您可以先将输入存储在字符串变量中,并在其上调用 scanner 构造函数。
评论
您需要告诉程序将不再有输入。这是通过附加 EOF 字符来完成的。这可以在 Linux 上通过在控制台中按 Ctrl-D 手动完成。我认为在 Windows 上您可以按 Ctrl-Z。如果将输入从一个程序通过管道传输到另一个程序,则流将自动关闭。
例如。
cat filename | java MyJavaProgram
的魔力
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextLine()){
是永远不会停止从系统输入(除非您使用 ctrl+d 关闭输入(对于 macs))。
为了停止循环,我建议在条件中抛出更多的东西,而不仅仅是 hasNextLine()。
例如
Scanner scanner = new Scanner(System.in); //scanner reads block of input
int BLOCK_SIZE =3,count=1;
while(scanner.hasNextLine() && count++ <= BLOCK_SIZE){ //<- Use count here.
//body of loop goes here
String s = scanner.nextLine();
Scanner ls = new Scanner(s); //scanner to parse a line of input
while(ls.hasNext()){
//body of nested loop goes here
ls.next();
}
}
System.out.println("Fin");
}
评论
hasNextLine
你怎么知道用户什么时候完成了输入,下一个“Enter”应该不表示新的输入行,而是表示输入的结束?
您可以尝试计算行数并在最大值后跳出循环。或者,您可以寻找特定的输入(例如“submit”)来打破循环。
否则,如果 ,则程序将每个回车视为一条新线,因此该条件永远不会失败。scanner.hasNextLine()
评论