2016-07-13 4 views
0

Если у нас есть символ в нашем текстовом файле, который находится в Юникоде, то не должно быть 2 байта данных? Но метод read() считывает один байт за один раз как int. Итак, если у нас есть объект FileInputStreamfin, и мы вызываем int x = fin.read() один раз, как мы получим полный символ на System.out.println(x), если был прочитан только один байт? (fin.read() не находится в петле while или что-то в этом роде, она только что называется один раз)Почему read() читает один байт за раз, если char равен 2 байтам?

+1

Он читает по одному байту за раз, потому что он задан для чтения по одному байту за раз. Если вам нужно иметь дело с Strings красиво, вам придется использовать декоратор. –

+0

Не точный дубликат, но принятый ответ связанного вопроса объясняет разницу между чтением байтов и символами. –

ответ

2

Хороший вопрос! Вы правы, что в Java символы всегда два байта, но это неверно в другом месте (например, в содержимом файла).

Файл не кодируются «в„Unicode“, потому что Unicode является спецификацией, а не кодирование. Кодировки карты спецификации Unicode для некоторых последовательностей байт, а не все такие кодировки используют два байта символы. Java char ы является UTF-16 который всегда имеет ширину в два байта, но многие файлы хранятся в виде UTF-8, который имеет переменную ширину, а символы ASCII - один байт, другие - два или более.

Более того, InputStream предназначен для чтения двоичных данных, не символов, а двоичные данные (по существу) всегда читаются по одному байту за раз. Если вы хотите прочитать текст, вы переносите свой поток в aa Reader (предпочтительно явно указывая кодировку, которая будет использоваться) для преобразования двоичных данных в текст. Внутри он будет вызывать read() один или несколько раз, чтобы правильно построить символ из последовательности байтов на основе кодировки.

2

Потоки предназначены для чтения байтов, а не символов. Если вы хотите читать символы, используйте Reader. Читатель будет читать символы по одному и будет обрабатывать символы, декодирующие из байтов: в зависимости от кодировки символов (и самого символа) символ может быть закодирован в один байт, два или даже больше.

Смежные вопросы