Почему isEmpty() пропускает много строк в 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

person pelangi    schedule 16.05.2012    source источник


Ответы (2)


Каждый вызов 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);
    }
}
person MByD    schedule 16.05.2012
comment
Спасибо, сэр. Это мне очень помогает. - person pelangi; 16.05.2012

Посмотрите на управление потоком вашего кода.

Где вы оказываетесь, когда делаете это?

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

Вы читаете строку, и код продолжает цикл:

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

Который читал другую строчку.

Таким образом, каждый раз, когда вы сталкиваетесь с пустой строкой, вы игнорируете строку, следующую за ней.

Вероятно, вам следует просто сделать:

else if (line.isEmpty()) { //*this
  continue;
}
person nos    schedule 16.05.2012