在Java中,不能使用Scanner一次只读取一行

时间:2013-07-08 02:32:21

标签: java file-io java.util.scanner

我试图在java中逐行读取文件。这是我的代码:

Scanner s= new Scanner(new FileReader("outputfile.txt"));
    String line = null;
    while (!(line = s.nextLine()).contains("OK")) {
        if (line.contains("BOOK")) {
            //do something
        }   
    }

我想要做的是,我逐行读取文件,如果下一行中有“OK”,那么我就停止阅读了。但问题是,因为我有

!(line = s.nextLine()).contains("OK")

每次我进入该行

if (line.contains("BOOK")), 

因为line = s.nextLine() 我读了另一行,在一个循环周期中我读了两行。我该如何解决这个问题?

由于

4 个答案:

答案 0 :(得分:0)

为了清晰起见,让我们展开代码:

while (true) {
  line = s.nextLine();
  if (line == null || line.contains("OK")) break;
  if (line.contains("BOOK")) { ... }
}

不幸的是"BOOK""OK"在里面,所以第二个条件无法访问。

您需要更仔细地查看文件的语法以正确解析它。

答案 1 :(得分:0)

想想你在这做什么......

// LOOP
// Read the next line
// Does this line contain "OK"
      // YES -> End loop
      // NO  -> Does the line contain "BOOK" - Obviously it cant if it didn't contain "OK"
      //     -> BACK TO LOOP

答案 2 :(得分:0)

试试这个

while (s.hasNextLine()) {
      String line = s.nextLine();
      if (line.contains("BOOK")) {
          ...
      } else if (line.contains("OK") {
         break;
      }
}

答案 3 :(得分:0)

您误解了=运算符的工作原理。

line = s.nextLine()

并不意味着每次使用line时,都会调用s.nextLine()。相反,

line = s.nextLine()

表示“拨打s.nextLine()一次,并line参考s.nextLine()返回的内容”。因此,

if (line.contains("BOOK"))

不会再次调用s.nextLine()。它只查找前一个赋值存储在line中的值。循环每次迭代读取一行,而不是两行。如果你试过它,它似乎跳过行,那可能是因为“BOOK”包含“OK”,所以if中的代码永远不会运行。