在java中读取文本文件

时间:2017-06-21 03:53:07

标签: java

我有一个类打印机:

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

public class Printer {
private File file;

public Printer(String fileName) throws Exception {
    this.file = new File(fileName);
}

public void foo(String word) throws Exception {
    Scanner reader = new Scanner(this.file, "UTF-8");

    while (reader.hasNextLine()) {
        String line = reader.nextLine();

        if (word.isEmpty()) {
            //System.out.println(reader.nextLine());
            System.out.println(line);
        }
    }
    reader.close();
}
}

上面的代码运行正常。但是,当我取消注释System.out.println(reader.nextLine());并注释掉System.out.println(line);时,为什么会抛出NoSuchElementException?

2 个答案:

答案 0 :(得分:2)

我在这里看不太多,这让我感到惊讶。最有可能的是,第一次调用while时,Scanner#nextLine()循环就会触及文件末尾。然后,您进行第二次调用,抛出异常,因为没有更多内容可供阅读。

while (reader.hasNextLine()) {
    // during the last iteration, this next call consumes the final line
    String line = reader.nextLine();

    if (word.isEmpty()) {
        // but then you call nextLine() here again, causing the exception
        //System.out.println(reader.nextLine());
        System.out.println(line);
    }
}

这里故事的寓意是Scanner读取内容而不先检查内容是否存在。通过评论上面的这一行,你删除了问题,但你应该理解为什么你评论它可能是好的。

答案 1 :(得分:1)

这是因为您在每次循环迭代中读取了两行,但是如果有下一行则只检查一次。因此,如果文件具有奇数行,则当没有导致异常的下一行时,您将调用nextLine