Java - Scanner.nextLine()即使在考虑换行时也会跳过

时间:2016-09-20 02:50:06

标签: java file-io

我试图逐行读取文件。这是一个文件示例:

state   0   start
state   5   accept
transition  0   0   1   x   R
transition  1   0   0   x   R

我为文件创建了一个Scanner对象,并将分隔符设置为\t。只要有下一行,我就会遍历文件。我想检查一行是以state还是transition开头,然后获取以下信息。对于以state开头的行,我使用nextInt()然后使用next()分别获取0start。然后出现了进入下一行并重复该过程的问题。我使用nextLine()以及事情变得丑陋的地方。

我知道nextLine()不会使用换行符,所以我想两次使用它会产生更多问题。

Scanner sc = new Scanner(file);
sc.useDelimiter("\t");

while(sc.hasNextLine())
{
    if(sc.next().equals("state") == true)
    {
        int stateNumber = sc.nextInt();
        String state = sc.next();
        sc.nextLine();
    }
    sc.nextLine();
}

这似乎是创造问题的重要代码。

我是否误解next()如何运作或我完全错过了其他内容?

1 个答案:

答案 0 :(得分:1)

这里的一个选择是简单地在一行中读取每一行,然后用分隔符(制表符)拆分以获得各个组件:

which (sc.hasNextLine()) {
    String line = sc.nextLine();
    String[] parts = line.split("\\t");

    if (parts[0].equals("state")) {
        // construct custom object here
    }
}

如果您想坚持使用原始方法,请使用:

while(sc.hasNextLine()) {
    if (sc.next().equals("state")) {
        int stateNumber = sc.nextInt();
        String state = sc.next();
    }

    // consume the entire remaining line, line break included
    sc.nextLine();
}

对于那些包含"state"的行,您正在拨打nextLine()两次,这会导致整行丢失。