java - BufferedReader:确定读取行的字节偏移量

标签 java utf-8 bufferedreader

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

问题:我无法使用插入到 BufferedReader 中的 InputStream 的位置 - 读取器缓冲并一次读取多于一行。

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

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

还有其他解决方案吗?

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

最佳答案

只需将文件作为原始字节读取,UTF-8 中的换行符将始终是 131013 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;
}

关于java - BufferedReader:确定读取行的字节偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14415084/

相关文章:

perl - 如何在 Perl 中将命令行参数视为 UTF-8?

php - É 而不是 "é",绝对不知道为什么

java - 一个简单的java客户端服务器程序

python - 在python中不使用openCV读取视频文件

java - 如何在java中打印svg?

java - 填充数组列表的随机索引出现 NullPointerException?

python 内存使用 : txt file much smaller than python list containing file text

java - 逐行读取文件夹中的所有.txt 文件

java - 类型参数的意义是什么?为什么我们需要在返回类型中添加它一次,然后在修饰符和返回类型之间添加它?

java - 是否可以通过Java中的NTP客户端同步系统时钟?