У меня есть буферизованный ридер, использующий 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();
}
}
}
Почему вы буферизуете уже буферизованный класс?
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));
Спасибо чувак, долго не мог разобраться. Пытался принять ваш ответ, но он говорит, что у меня недостаточно представителей для этого.
When running the code, the last time it reads it must not completely fill the buffer.
Что именно вы имеете в виду под этим? Спасибо.