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

Java BufferedReader:确定读取行的字节偏移量,java,utf-8,bufferedreader,Java,Utf 8,Bufferedreader,我使用BufferedReader逐行读取字节流(UTF-8文本)。出于特定的原因,我需要知道行在字节流中的确切起始位置 问题是:我不能使用我插入到BufferedReader的InputStream的位置——以及——读卡器一次缓冲并读取多行 我的问题:如何确定读取的每行的精确字节偏移量? 一个明显(但不正确)的解决方案是使用(行+“\n”).getBytes(“UTF-8”).length。这种方法有两个问题:1)仅计算字节数,将字符串转换回字节会带来相当大的开销;2)换行符并不总是标有“\n

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

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

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

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

还有其他解决方案吗?


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

尝试设置缓冲区大小:

BufferedReader (Reader in, int sz)
参数:

中的-阅读器

sz-输入缓冲区大小


将缓冲大小设置为1。

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

BufferedReader
等效的原始字节为

您还可以在不编码的情况下计算字符串的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;
}
公共静态int字节计数utf8(字符串输入){
int-ret=0;
对于(int i=0;iif(cc)这是一个内部优化细节,而不是将功能更改为外部。如果不使用size参数,它与
new BufferedReader(in,8192)相同
@Esailija 8192是默认的缓冲区大小,但是如果我将其设置为1,它会在每次调用时读取一个字符吗?是的,但这只会使它变慢