5

我正在使用 BufferedReader 逐行读取字节流(UTF-8 文本)。出于特定原因,我需要知道该行在字节流中的确切位置开始。

问题:我不能使用我插入到 BufferedReader 的 InputStream 的位置——以及——阅读器一次缓冲并读取超过一行。

我的问题:如何确定每行读取的精确字节偏移量?

一种明显(但不正确)的解决方案是使用 (line + "\n").getBytes("UTF-8").length。这种方法有两个问题:1)只是为了计算字节数,将字符串转换回字节是相当大的开销;2)换行符并不总是用“\n”标记——它也可能是“\ r\n”等。

有没有其他解决方案?

编辑:到目前为止,我看到的每一个类似于 LineReader 的类似乎都被缓冲了。有谁知道类似 LineReader 的无缓冲类?

4

2 回答 2

1

只需将文件作为原始字节读取,UTF-8 中的换行符将始终为13and10或... 但如果文件将具有不同的 EOL 约定,则将文件作为字符串读取时会遇到完全相同的问题1310

的原始字节等价物BufferedReaderBufferedInputStream

您还可以在不编码的情况下计算字符串的 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;
}
于 2013-01-19T14:22:53.547 回答
0

尝试设置缓冲区大小:

BufferedReader (Reader in, int sz)

参数:

- 一个读者

sz - 输入缓冲区大小

将缓冲大小设置为 1。

于 2013-01-19T14:22:27.900 回答