Java:当并非所有行都有新行时,从文件中读取行

时间:2017-04-10 16:37:50

标签: java string file java.util.scanner

我正在开发一个打开数据文件的程序,并使用while循环逐行读取文件,以便将数据存储在二叉搜索树中。我唯一的问题是我不知道如何处理循环条件,因为文件的最后一行没有新的行字符。我通常使用带扫描程序的hasNextLine()来读取文件,但这会在程序中引发错误,我不能使用hasNext(),因为我需要抓住整行而不仅仅是它的一部分。什么是最好的方法呢?

    public static BinaryTree getInventory(BinaryTree tree, Scanner input) {
    String line, title = "";
    int available = -1, rented = -1, comma = 0;
    boolean quote = true;

    // While not the end of file
    while (input.hasNextLine()) {
        line = input.nextLine();

        for (int i = 1; i < line.length(); i++) {
            if (line.charAt(i) == '"') {
                title = line.substring(1, i);
                comma = i + 1;
                quote = false;
                i++;
            } 
            else if (line.charAt(i) == ',' && !quote) {
                available = Integer.parseInt(line.substring(comma + 1, i - 1));
                comma = i;
                i++;
            } 
            else if (i + 1 == line.length()) {
                rented = Integer.parseInt(line.substring(comma + 1, i));
            }

        }
        tree.insert(new Node(title,available,rented));
    }
    return tree;
}

2 个答案:

答案 0 :(得分:1)

您可以通过捕获hasNext()来避免NoSuchElementException的需要。同时给出了文件的结构(似乎是"title",XX,YY),你可以避免使用像这样的代码循环使用行字符

try {
    while (true) {
        String line = input.nextLine();
        int rdquo = line.indexOf('"', 1);
        String title = line.substring(1, rdquo);
        String[] avail = line.substring(rdquo+2).split(",");
        tree.insert(new Node(title, Integer.parseInt(avail[0]) , Integer.parseInt(avail[1]));
    }
} catch (NoSuchElementException reachedEndOfFile) { }

答案 1 :(得分:0)

接受的答案应该可以很好地解决您的问题,但我认为值得指出一些问题,以便您(或从您的帖子中学习的人)正确理解Scanner的工作原理。

给定像Line 1\nLine 2这样的输入源,其中第2行不以换行符结尾,以下代码将打印两行而不会产生任何错误。

while (input.hasNextLine()) {
    System.out.println(input.nextLine());
}

这也会打印两行。

while (input.hasNext()) {
    System.out.println(input.nextLine());
}

鉴于你的示例代码,我认为你的一个标题很可能包含一个逗号,这会导致Integer.parseInt尝试解析一些不是整数的文本。在寻求帮助以排除引发错误的代码时,分享异常和可能的堆栈跟踪很有帮助。