Joh*_*nes 5 java utf-8 bufferedreader
我正在使用 BufferedReader 逐行读取字节流(UTF-8 文本)。出于特定原因,我需要知道该行在字节流中的确切位置开始。
问题:我无法使用插入 BufferedReader 的 InputStream 的位置 - 同样 - 读取器缓冲并一次读取超过一行。
我的问题:如何确定读取的每行的精确字节偏移量?
一种明显(但不正确)的解决方案是使用 (line + "\n").getBytes("UTF-8").length。这种方法有两个问题:1)仅计算字节数,将字符串转换回字节是相当大的开销,2)换行符并不总是标记为“\n” - 它也可能是“\ r\n”等
对此还有其他解决方案吗?
编辑:到目前为止我见过的每个类似 LineReader 的类似乎都是缓冲的。有谁知道类似无缓冲的 LineReader 类吗?
只需将文件作为原始字节读取,UTF-8 中的换行符将始终为13and10或... 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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1999 次 |
| 最近记录: |