Буферизованный ридер не сбрасывает символы в буфер при достижении EOF

У меня есть буферизованный ридер, использующий read(buffer, off, len). Ридер читает текстовый файл в буфер из 2048 символов. Он читает и печатает то, что находится в буфере, пока не достигнет конца и не вернет -1. В этот момент он больше не сбрасывает последние символы в свой буфер.

Я пробовал сбрасывать буфер после каждого чтения, но безрезультатно.

Код для воспроизведения.

При выполнении кода последний раз, когда он считывается, он не должен полностью заполнять буфер.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

```
public class bufferRead{
    public static void main(String[] args) {
       
        try {
            FileReader reader = new FileReader("path to file");
            BufferedReader br = new BufferedReader(reader);

            char[] buffer = new char[2048];
            int off = 0;
            int totalNumRead = 0;
            int numRead;
            while ((numRead = br.read(buffer, off, 2048)) != -1) {
                totalNumRead += numRead;
                System.out.println(numRead + " " + totalNumRead);
                System.out.println(buffer);
            }
            System.out.println(buffer);
            System.out.println(numRead + " " + totalNumRead);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
} 
When running the code, the last time it reads it must not completely fill the buffer. Что именно вы имеете в виду под этим? Спасибо.
Jason 13.05.2022 20:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
18
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Почему вы буферизуете уже буферизованный класс?

String folder = "/path/to/folder";
String file = "filename";
try (BufferedReader reader = Files.newBufferedReader(FileSystems.getDefault().getPath(folder, file), StandardCharsets.UTF_8)) {
    reader.lines().forEach(System.out::println);
} catch (Exception e) {
    e.printStackTrace();
}
Ответ принят как подходящий

Обратите внимание, что br.read(buffer, off, 2048) возвращает количество прочитанных символов.

Для самой последней итерации цикла numRead может быть меньше buffer.length, поэтому buffer будет содержать символы из последней И предпоследней строки:

 System.out.println(buffer);

Но если вы измените это, он будет печатать только то, что было прочитано для каждой итерации, поскольку он устанавливает напечатанное значение в точное количество прочитанных символов:

 System.out.println(new String(buffer,0, numRead));

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

pablo SquarePants 13.05.2022 20:42

Другие вопросы по теме