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));
我有一个缓冲的 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));