当前位置: 首页 > 知识库问答 >
问题:

如何知道BufferedReader的字节读取(偏移量)?

羊舌胡非
2023-03-14
String buffer;
int offset = 0;

while ((buffer = br.readLine()) != null)
    offset += buffer.getBytes().length + 1; // 1 is for line separator

如果文件很小,我就工作。但是,当文件变大时,偏移量将小于实际值。我怎样才能得到抵消?

共有1个答案

贺轶
2023-03-14

对于BufferedReader,没有简单的方法可以做到这一点,因为有两种影响:字符结尾编码和行结尾。在Windows上,行尾是\r\n,这是两个字节。在Unix上,行分隔符是一个字节。BufferedReader将在您没有注意到的情况下处理这两种情况,因此在readline()之后,您将不知道跳过了多少字节。

此外,buffer.getBytes()只在默认编码和文件中数据的编码偶然相同时返回正确的结果。当使用字节[]<->String任何类型的转换时,应始终准确指定应使用哪种编码。

您也不能使用计数inputstream,因为缓冲的读取器读取大量数据。因此,在读取第一行(比方说5个字节)后,内部inputstream中的计数器将返回4096,因为读取器总是将这么多字节读入其内部缓冲区。

 类似资料:
  • 编辑:到目前为止,我所见过的每一个类似LineReader的类似乎都被缓冲了。有没有人知道一个无缓冲的类linereader类?

  • 据我所知,缓冲阅读器比非缓冲阅读器优化了很多,因为每次读取都将从内存中完成,不需要每次都从磁盘/网络进行I/O读/写。 所以我在这里阅读答案: 缓冲读取器和文件读取器之间的特定区别 我被第二个答案弄糊涂了,这个答案似乎有很高的票数: 当向BufferedReader对象发出“read”指令时,它会使用FileReader对象从文件中读取数据。当给出指令时,FileReader对象一次读取2(或4)

  • 问题内容: 我有一个文件,文件的前4个字节是魔术,例如。我将如何获得这些数据? 我以为会是这样的: 输出: 可惜这对我不起作用。我找不到获取特定值的方法。 有没有人看到解决此问题的任何方法? 问题答案: 使用到位置,你想从阅读和阅读完整的阵列。 代码的问题在于,当您以读写模式创建文件时,文件指针很可能指向文件末尾。使用方法定位。 您也可以使用此方法,但是offset和length对应 于数组 中开

  • 对不起,如果这个问题是一个迟钝的,但我没有得到一个答案,我正在寻找。 Java docs这样说 通常,对读取器的每个读取请求都会导致对底层字符或字节流的相应读取请求。因此,建议将BufferedReader包装在任何读取()操作可能代价高昂的读取器周围,例如FileReaders>和InputStreamReaders。例如, 将缓冲来自指定文件的输入。如果不进行缓冲,每次调用read()或rea

  • 问题内容: 我想优化此代码: 事情是,我不知道如何读取bufferedReader的内容并将其复制到String中,比我上面的速度更快。我需要花费尽可能少的时间。谢谢 问题答案: 在循环中使用字符串连接是 在 经典的性能杀手(因为字符串是不可变的,整个越来越大的字符串被复制为每个连接)。改为这样做:

  • 问题内容: 嘿,我正在尝试打开文件,仅从偏移量读取一定长度!我阅读了以下主题: 如何使用Java中的文件中的特定行号读取特定行? 在那儿,它说在不读取之前就不可能读取某行,但是我想知道字节! 是否可以从已知偏移量读取某些字节? 问题答案: RandomAccessFile提供一个功能: