gpt4 book ai didi

java - 如何知道 BufferedReader 的字节读取(偏移量)?

转载 作者:搜寻专家 更新时间:2023-10-31 20:13:19 27 4
gpt4 key购买 nike

我想逐行读取文件。BufferedReader 比 RandomAccessFile 或 BufferedInputStream 快得多。但问题是我不知道我读了多少字节。如何知道读取的字节数(偏移量)?我试过了。

String buffer;
int offset = 0;

while ((buffer = br.readLine()) != null)
offset += buffer.getBytes().length + 1; // 1 is for line separator

如果文件很小,我会工作。但是,当文件变大时,偏移量变得小于实际值。我怎样才能得到补偿?

最佳答案

BufferedReader 没有简单的方法可以做到这一点,因为有两个影响:字符结束编码和行结束。在 Windows 上,行结尾是 \r\n,这是两个字节。在 Unix 上,行分隔符是一个字节。 BufferedReader 会在您不注意的情况下处理这两种情况,因此在 readLine() 之后,您不会知道跳过了多少字节。

此外,buffer.getBytes() 仅当您的默认编码和文件中数据的编码偶然碰巧相同时才返回正确的结果。使用任何类型的 byte[] <-> String 转换时,您应该始终明确指定应该使用哪种编码。

您也不能使用计数 InputStream,因为缓冲读取器以大块读取数据。因此,在读取第一行(例如 5 个字节)后,内部 InputStream 中的计数器将返回 4096,因为读取器总是将那么多字节读入其内部缓冲区。

这个你可以看看NIO。您可以使用低级 ByteBuffer 来跟踪偏移量并将其包装在 CharBuffer 中以将输入转换为行。

关于java - 如何知道 BufferedReader 的字节读取(偏移量)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15092869/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com