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

时间:2013-01-19 13:58:59

标签: java utf-8 bufferedreader

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

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

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

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

还有其他解决方法吗?

编辑:到目前为止我看过的每个类似LineReader的类似乎都是缓冲的。有没有人知道类似无缓冲的LineReader类?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

尝试设置缓冲区大小:

BufferedReader (Reader in, int sz)
  

参数:

     中的

- 阅读器

     

sz - 输入缓冲区大小

将缓冲大小设置为1。