0

我有一个RandomAccessFile raFile我正在以固定大小的块将数据读入缓冲区的方法:

byte[] fileBuffer = new byte[BUFFER_SIZE];

while((readBytes = raFile.read(fileBuffer) >= 0) {
    String bufferStr = new String(fileBuffer, 0, readBytes);
    String testerStr = new String(fileBuffer);

    System.out.println(readBytes+","+bufferStr.length()+","+testerStr.length());
}

我所期望的是raFile.read()读取与 一样多的字节BUFFER_SIZE(文件末尾除外)并将相同的值复制到readBytes. 虽然这在很大程度上是正确的,但偶尔,我会得到以下BUFFER_SIZE4096 的输出:

readBytes bufferStr testerStr
 4096 4092 4092
 4096 4090 4090
 4096 4094 4094
 4096 4095 4095

如果正在读取 4096 字节,为什么即使不在文件末尾,长度bufferStrtesterStr小于该值?

参考:表示read()返回读入缓冲区的字节总数。

4

3 回答 3

2

因为有些字符需要超过一个字节。bufferStr.lenght() 为您提供字符数,而不是字节数。

于 2012-05-11T12:00:59.660 回答
1

读取的字节数和由这些字节创建的字符串中的字符数之间存在差异。从流中读取的字节总是有 8 位。字符串的一个字符最多可以有 16 位 (Unicode)。因此,输入的两个字节可以在创建的字符串中产生一个字符。

于 2012-05-11T12:02:19.397 回答
0

巴勃罗的正确观点。尝试:

    System.out.println(readBytes+","+bufferStr.getBytes().length+
          +","+testerStr.getBytes().length);

看看结果。

于 2012-05-11T12:04:24.773 回答