如何使用Java Scanner测试空白行?

时间:2011-09-06 13:01:38

标签: java java.util.scanner

我希望用扫描仪输入,直到没有任何东西(即当用户输入空行时)。我该如何实现这一目标?

我试过了:

while (scanner.hasNext()) {
    // process input
}

但那会让我陷入困境

5 个答案:

答案 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);