RandomAccessFile.read()返回的值大于读入字符串的字符数

时间:2012-05-11 11:55:14

标签: java java-io file-read

我有一个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_SIZE 4096的以下输出:

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

如果正在读取4096个字节,为什么即使不在文件结束时bufferStrtesterStr的长度也小于此值?

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

3 个答案:

答案 0 :(得分:2)

因为有些字符需要多个字节。 buffer Str.length()为您提供字符数,而不是字节数。

答案 1 :(得分:1)

读取的字节数与使用这些字节创建的字符串中的字符数之间存在差异。从流中读出的字节总共有8位。字符串的字符最多可以包含16位(Unicode)。因此输入的两个字节可以导致在String中创建一个字符。

答案 2 :(得分:0)

巴勃罗的真实观点。 尝试:

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

并查看结果。