Scanner类,hasNextLine即使没有任何下一行也给出true

时间:2015-08-24 13:38:07

标签: java

我的输入txt文件包含以下内容:

  

aa1 aa2
      bb1 bb2
      cc1 cc2

在光标到达最后一行之后,hasNextLine()方法在读取cc1和cc2时如何赋予真?我以为我只会得到aa1到bb2。

输出:

  

aa1
          aa2
          BB1
          BB2
          CC1
          CC2

package test;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Test {

    public static void main(String[] args) throws FileNotFoundException {

        File f = new File("K:\\Test\\a.txt");
        System.out.println(f.exists());
        Scanner reader = new Scanner(f);
        while (reader.hasNextLine()) {
            System.out.println(reader.next());

        }

    }

}

1 个答案:

答案 0 :(得分:0)

使用hasNextLine()和nextLine(),或者使用hasNext()和next()。混合这些可能导致不希望的行为(除非故意使用)。查看他们的文档here。引用next()方法:

  

如果匹配指定的模式,则返回下一个标记。即使之前的hasNext(Pattern)调用返回true,此方法也可能在等待输入扫描时阻塞。如果匹配成功,扫描仪将超过与模式匹配的输入。

此外,在Scanner类文档中,您可以找到:

  

扫描程序使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格。

因此,扫描仪读取第一行,它前进到第一个分隔符(空白区域)并打印第一个部分(aa1)。然后,仍然在同一行,它打印第二部分(aa2)。然后,它移动到第二行,打印(bb1),然后打印(bb2),然后while条件为真,因为还有下一行。所以,最后,在第三行,它打印第一部分(cc1),它打印第二部分(cc2),然后停止,因为没有其他行。