【发布时间】:2016-02-15 17:49:27
【问题描述】:
我期待扫描仪的输入,直到什么都没有(即当用户输入一个空行时)。我如何实现这一目标?
我试过了:
while (scanner.hasNext()) {
// process input
}
但这会让我陷入困境
【问题讨论】:
我期待扫描仪的输入,直到什么都没有(即当用户输入一个空行时)。我如何实现这一目标?
我试过了:
while (scanner.hasNext()) {
// process input
}
但这会让我陷入困境
【问题讨论】:
这是一种方法:
Scanner keyboard = new Scanner(System.in);
String line = null;
while(!(line = keyboard.nextLine()).isEmpty()) {
String[] values = line.split("\\s+");
System.out.print("entered: " + Arrays.toString(values) + "\n");
}
System.out.print("Bye!");
【讨论】:
hasNextLine() 类型的方法,其中“指针”没有转到下一行?
scanner.hasNext() 时,您仍需要获取该行以检查它是否为空并进行处理。您能解释一下为什么 Bart 的回答对您不起作用吗?
Scanner的目的,即它可以帮助您进行标记化。
来自http://www.java-made-easy.com/java-scanner-help.html:
问:如果我用 Java 的 Scanner 扫描一个空行会怎样?
答:视情况而定。如果您使用 nextLine(),则会读取一个空行 in 作为一个空字符串。这意味着如果您要存储空白 字符串变量中的行,该变量将保存“”。它不会 商店“”或放置了许多空间。如果你使用 next(), 那么它根本不会读取空行。它们被完全跳过。
我的猜测是nextLine() 仍然会在空行上触发,因为从技术上讲,扫描器将拥有空字符串""。所以,你可以检查if s.nextLine().equals("")
【讨论】:
使用scanner.nextLine() 的建议的问题在于它实际上将下一行返回为String。这意味着那里的任何文本都会被消耗掉。如果您有兴趣扫描该行的内容……好吧,太糟糕了!您必须自己解析返回的String 的内容。
更好的方法是使用
while (scanner.findInLine("(?=\\S)") != null) {
// Process the line here…
…
// After processing this line, advance to the next line (unless at EOF)
if (scanner.hasNextLine()) {
scanner.nextLine();
} else {
break;
}
}
由于(?=\S) 是一个零宽度的前瞻断言,它永远不会消耗任何输入。如果它在当前行中找到任何非空白文本,它将执行循环体。
如果您确定循环体已经使用了该行中的所有非空白文本,则可以省略 else break;。
【讨论】:
Scanner key = new Scanner(new File("data.txt"));
String data = "";
while(key.hasNextLine()){
String nextLine = key.nextLine();
data += nextLine.equals("") ? "\n" :nextLine;
}
System.out.println(data);
【讨论】:
AlexFZ 是对的,scanner.hasNext() 将永远为真并且循环不会结束,因为总是有字符串输入,即使它是空的“”。
我遇到了同样的问题,我是这样解决的:
do{
// process input
}while(line.length()!=0);
我认为do-while 更适合这里,因为您必须在用户输入后评估输入。
【讨论】: