BufferReader неожиданный вывод - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть простой метод:

private String read(String filePath) throws IOException {
    FileReader fileReader = new FileReader(filePath);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    String fileContent = "";
    StringBuilder stringBuilder = new StringBuilder(fileContent);

    while (bufferedReader.readLine() != null){
        System.out.println(bufferedReader.readLine());
        stringBuilder.append(bufferedReader.readLine());
    }
    return fileContent;
}

Как вы можете видеть в строке 8, я включил печать для отладки. Я хотел бы, чтобы этот метод возвращал строку из этого текстового файла:

1a1
2b 2a
3c 3b 3a
4d 4cr 4bb4 4a
5e 5d 5c 5b 5ax
6f 6ea 6d 6ca 6bb 6a
7g 7f 7ea

по какой-то причине вывод выглядит так:

2b 2a
5e 5d 5c 5b 5ax
null

Почему он читает только вторую и пятую строки?Откуда этот ноль?Возвращенная строка в конце кажется пустой.

Я бы хотел понять, что здесь происходит.Спасибо :)

Ответы [ 4 ]

0 голосов
/ 15 декабря 2018
1a1                   // Read 1 while (bufferedReader.readLine() != null) 
next 2a               // Read 2 System.out.println(bufferedReader.readLine()); --print
3c 3b 3a              // Read 3 stringBuilder.append(bufferedReader.readLine());-next
0 голосов
/ 15 декабря 2018

Каждый readLine() читает совершенно новую строку, чтобы проанализировать, что происходит, давайте назовем каждый readLine() вызов.

while (bufferedReader.readLine() != null) {          // Read 1
    System.out.println(bufferedReader.readLine());   // Read 2
    stringBuilder.append(bufferedReader.readLine()); // Read 3
}

Теперь давайте свяжем каждый readLine() со строкой, которую он читает:

1a1                   // Read 1 while loop condition
2b 2a                 // Read 2 this is when we print it
3c 3b 3a              // Read 3 append to stringBuilder
4d 4cr 4bb4 4a        // Read 1 while loop condition
5e 5d 5c 5b 5ax       // Read 2 this is when we print it
6f 6ea 6d 6ca 6bb 6a  // Read 3 append to stringBuilder
7g 7f 7ea             // Read 1 while loop condition
                      // Read 2 this is when we print it (null)
                      // Read 3 append to stringBuilder

Как видите, вы потребляете много строк, и вы печатаете только несколько.Другие уже указали отличные решения, чтобы исправить это уже, следовательно, это не в этом ответе.

0 голосов
/ 15 декабря 2018

Хорошо, проблема здесь: вы вызываете bufferedReader.readLine() каждый раз, это фактически читает новую строку каждый раз, поэтому первая строка читается в while и отбрасывается, вторая строка System.out.println -ed,третий записывается в файл и так далее.Вам нужно сохранить первую строку для чтения и работы, например:

for (String line = bufferedReader.readline(); line != null; line = bufferedReader.readLine()) {
    System.out.println(line);
    stringBuilder.append(bufferedReader.readLine());
}
0 голосов
/ 15 декабря 2018

Это потому, что вы используете каждую третью строку в проверке null цикла while, печатаете каждую третью строку, считая от двух, и добавляете каждую третью строку, считающую из трех, как это:

1  null check
2  print
3  append
4  null check
5  print
6  append
7  null check
8  print
9  append
... and so on

Вы должны сохранить прочитанную строку в переменной String и использовать ее внутри цикла следующим образом:

String line;
while ((line = bufferedReader.readLine()) != null){
    System.out.println(line);
    stringBuilder.append(line);
}

Теперь заголовок цикла объединяет присваивание и проверку null, апеременная, присвоенная от readLine, представляет последнюю строку, прочитанную из файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...