如何使用Java Scanner测试空行?

如何使用Java Scanner测试空行?,java,java.util.scanner,Java,Java.util.scanner,我期待扫描仪的输入,直到什么都没有(即,当用户输入一个空行)。我如何做到这一点 我试过: while (scanner.hasNext()) { // process input } 但这会让我陷入困境这里有一个方法: Scanner keyboard = new Scanner(System.in); String line = null; while(!(line = keyboard.nextLine()).isEmpty()) { String[] values = lin

我期待扫描仪的输入,直到什么都没有(即,当用户输入一个空行)。我如何做到这一点

我试过:

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!");
发件人:

问:如果我用Java的扫描器扫描一个空行,会发生什么

A:看情况。如果您使用的是nextLine(),则将读取一个空行 以空字符串形式输入。这意味着,如果您要存储空白 在字符串变量中,该变量将包含“”。不会的 存储“”或放置了多少空间。如果使用的是next(), 然后它将根本不读取空白行。他们完全被跳过了


我猜
nextLine()
仍将在空行上触发,因为从技术上讲,扫描仪将具有空字符串
”。因此,您可以检查
如果s.nextLine().equals(“”)是正确的,
scanner.hasNext()
将始终为真,循环不会结束,因为即使字符串输入为空,也始终存在字符串输入

我也遇到了同样的问题,我这样解决:
do{
    // process input
}while(line.length()!=0);
do{
//过程输入
}while(line.length()!=0);

我认为
do-while
更适合这里,因为您必须在用户输入后评估输入。

建议使用
scanner.nextLine()
的问题是,它实际上会以
字符串的形式返回下一行。这意味着那里的任何文本都会被消费。如果你有兴趣扫描那一行的内容…好吧,太糟糕了!您必须自己解析返回的
字符串的内容

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);
更好的方法是使用

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)
是一个零宽度的先行断言,因此它永远不会使用任何输入。如果在当前行中找到任何非空白文本,它将执行循环体


您可以省略
否则中断如果您确定循环体已经使用了该行中的所有非空白文本。

这会产生一个副作用,即已经获取了该行(例如,如果我想解析由空格分隔的值,我需要按空格分割该行)。是否有一个
hasNextLine()
type方法,其中“指针”不会转到下一行?@jiewmeng-当您调用
scanner.hasNext()
时,您仍需要提取该行以检查它是否为空并处理它。你能解释一下为什么巴特的回答对你不起作用吗?分割行的问题是它违背了
扫描仪的目的,这就是它帮助你进行标记化。