我希望用扫描仪输入,直到没有任何东西(即当用户输入空行时)。我该如何实现这一目标?
我试过了:
while (scanner.hasNext()) {
// process input
}
但那会让我陷入困境
答案 0 :(得分:18)
这是一种方式:
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!");
答案 1 :(得分:5)
来自http://www.java-made-easy.com/java-scanner-help.html:
问:如果我使用Java的扫描仪扫描一个空白行会怎么样?
答:这取决于。如果您使用的是nextLine(),则会读取一个空行 在一个空字符串中。这意味着如果您要存储空白 在String变量中,变量将保持为“”。它不会 商店“”或者放置了许多空间。如果你正在使用next(), 然后它根本不会读取空白行。它们完全被跳过了。
我的猜测是nextLine()
仍会在空行上触发,因为从技术上讲,扫描程序将具有空字符串""
。因此,您可以查看if s.nextLine().equals("")
答案 2 :(得分:4)
使用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;
。
答案 3 :(得分:0)
AlexFZ是对的,scanner.hasNext()
将永远为真,循环不会结束,因为即使它是空的,也总是有字符串输入“”。
我遇到了同样的问题,我解决了这个问题:
do{
// process input
}while(line.length()!=0);
我认为do-while
更适合这里,因为您必须在用户输入后评估输入。
答案 4 :(得分:0)
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);