Buffered reader 到达 EOF 时不将字符刷新到缓冲区

Buffered reader does not flush characters to buffer when reaching EOF

我有一个缓冲的 reader 使用 read(buffer, off, len)。 reader 正在将一个 txt 文件读入 2048 个字符的缓冲区。它读取并打印缓冲区中的内容,直到到达末尾和 returns -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();
        }
    }
} 

为什么要缓冲已经缓冲的 class?

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) returns读入的字符数

对于循环的最后一次迭代,numRead 可能小于 buffer.length,因此 buffer 将包含最后一行和倒数第二行的字符:

 System.out.println(buffer);

但是如果你改成这个,它只会打印每次迭代读入的内容,因为它将打印值设置为读入的确切字符数:

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