为什么isEmpty()在BufferedReader中跳过很多行?

时间:2012-05-16 09:59:16

标签: java text io readline bufferedreader

我正在尝试使用BufferedReader从文本文件中读取。我想跳过一个有“#”和“*”的行,它可以工作。但它不适用于空行。我使用line.isEmpty()但只显示第一个输出。

我的文本文件如下所示:

# Something something
# Something something


# Staff No. 0

*  0  0  1

1 1 1 1 1 1

*  0  1  1

1 1 1 1 1 1

*  0  2  1

1 1 1 1 1 1

我的代码:

StringBuilder contents = new StringBuilder();
    try {
      BufferedReader input =  new BufferedReader(new FileReader(folder));
      try {
        String line = null;
        while (( line = input.readLine()) != null){
          if (line.startsWith("#")) {
              input.readLine(); 
          }
          else if (line.startsWith("*")) {
              input.readLine(); 
          }
          else if (line.isEmpty()) { //*this
              input.readLine(); 
          }
          else {
          contents.append(line);
          contents.append(System.getProperty("line.separator"));
          System.out.println(line);
          }
        }
      }
      finally {
        input.close();
      }
    }
    catch (IOException ex){
      ex.printStackTrace();
    }

我想要的输出应该是这样的:

1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1

2 个答案:

答案 0 :(得分:5)

如果未分配给变量,每次调用readline()都会跳过一行,只需删除这些调用,并且因为这会清空大多数if-else块,您可以将其简化为:

// to be a bit more efficient
String separator = System.getProperty("line.separator");
while (( line = input.readLine()) != null)
{
    if (!(line.startsWith("#") || 
          line.startsWith("*") ||
          line.isEmpty() )) 
    {
        contents.append(line);
        contents.append(separator);
        System.out.println(line);
    }
}

答案 1 :(得分:2)

查看代码的流控制。

当你这样做时,你最终会在哪里结束?

else if (line.isEmpty()) { //*this
    input.readLine(); 
}

你读了一行,代码继续循环:

while (( line = input.readLine()) != null){

其中读了另一行。

因此,每次遇到空行时,都会忽略它后面的行。

您应该这样做:

else if (line.isEmpty()) { //*this
  continue;
}