我正在使用BufferedReader逐行读取字节流(UTF-8文本)。由于某个特定原因,我需要知道行开始在字节流中的确切位置。
问题:我无法使用InputStream的位置插入到BufferedReader中 - 好吧 - 阅读器一次缓冲并读取多行。
我的问题:如何确定每行读取的精确字节偏移?
一个明显(但不正确)的解决方案是使用(line +“\ n”)。getBytes(“UTF-8”)。length。这种方法存在两个问题:1)只计算字节数,将字符串转换回字节是一个相当大的开销,2)换行符并不总是标有“\ n” - 它也可能是“\” r \ n“等等。
还有其他解决方法吗?
编辑:到目前为止我看过的每个类似LineReader的类似乎都是缓冲的。有没有人知道类似无缓冲的LineReader类?
答案 0 :(得分:1)
只需将文件作为原始字节读取,UTF-8中的换行符将始终为13
和10
,13
或10
...但这正是如果您将文件作为字符串读取,如果文件将具有不同的EOL约定,则会遇到同样的问题。
BufferedReader
的等效原始字节为BufferedInputStream
您还可以在不编码的情况下计算字符串的UTF-8字节:
public static int byteCountUTF8(String input) {
int ret = 0;
for (int i = 0; i < input.length(); ++i) {
int cc = Character.codePointAt(input, i);
if (cc <= 0x7F) {
ret++;
} else if (cc <= 0x7FF) {
ret += 2;
} else if (cc <= 0xFFFF) {
ret += 3;
} else if (cc <= 0x10FFFF) {
ret += 4;
i++;
}
}
return ret;
}
答案 1 :(得分:0)
尝试设置缓冲区大小:
BufferedReader (Reader in, int sz)
参数:
中的- 阅读器
sz - 输入缓冲区大小
将缓冲大小设置为1。