RandomAccessFile.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 байт, почему длина bufferStr и testerStr меньше этого значения, даже если они находятся не в конце файла?

Ссылка: Это говорит о том, что read() возвращает общее количество байтов, прочитанных в буфер.


person Karthik V    schedule 11.05.2012    source источник
comment
В вашем файле есть многобайтовые символы? длина строки указана в символах, а длина readBytes — в байтах.   -  person Konstantin V. Salikhov    schedule 11.05.2012


Ответы (3)


Потому что есть символы, которым нужно больше одного байта. bufferStr.lenght() дает вам количество символов, а не количество байтов.

person Pablo    schedule 11.05.2012

Существует разница между прочитанными байтами и количеством символов в строке, созданной из этих байтов. Байт, считанный из потока, всегда имеет 8 бит. Символ строки может иметь длину до 16 бит (Unicode). Таким образом, два байта ввода могут привести к одному символу в созданной строке.

person sebastian    schedule 11.05.2012

Верная точка зрения Пабло. пытаться:

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

и увидеть результат.

person Alex Stybaev    schedule 11.05.2012