【问题标题】:BufferedReader: Determine byte offset of lines readBufferedReader:确定读取行的字节偏移量
【发布时间】:2013-01-03 02:48:56
【问题描述】:

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

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

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

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

还有其他解决方案吗?

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

【问题讨论】:

    标签: java utf-8 bufferedreader


    【解决方案1】:

    只需将文件作为原始字节读取,UTF-8 中的换行符将始终为 13101310... 但这与您阅读时遇到的问题完全相同如果文件将具有不同的 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;
    }
    

    【讨论】:

      【解决方案2】:

      尝试设置缓冲区大小:

      BufferedReader (Reader in, int sz)
      

      参数:

      - 一个读者

      sz - 输入缓冲区大小

      将缓冲大小设置为 1。

      【讨论】:

      • 这是一个内部优化细节,而不是改变外部功能的东西。如果省略 size 参数,则与 new BufferedReader(in, 8192) 相同
      • @Esailija 8192 是默认缓冲区大小,但如果我将其设置为 1,它会在每次调用时读取一个字符吗?
      • 是的,但这只会让它变慢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 2012-04-02
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      相关资源
      最近更新 更多