我有一个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个字节,为什么即使不在文件结束时bufferStr
和testerStr
的长度也小于此值?
参考:This表示read()
返回读入缓冲区的总字节数。
答案 0 :(得分:2)
因为有些字符需要多个字节。 buffer Str.length()为您提供字符数,而不是字节数。
答案 1 :(得分:1)
读取的字节数与使用这些字节创建的字符串中的字符数之间存在差异。从流中读出的字节总共有8位。字符串的字符最多可以包含16位(Unicode)。因此输入的两个字节可以导致在String中创建一个字符。
答案 2 :(得分:0)
巴勃罗的真实观点。 尝试:
System.out.println(readBytes+","+bufferStr.getBytes().length+
+","+testerStr.getBytes().length);
并查看结果。