Если у нас есть символ в нашем текстовом файле, который находится в Юникоде, то не должно быть 2 байта данных? Но метод read()
считывает один байт за один раз как int
. Итак, если у нас есть объект FileInputStream
fin
, и мы вызываем int x = fin.read()
один раз, как мы получим полный символ на System.out.println(x)
, если был прочитан только один байт? (fin.read()
не находится в петле while
или что-то в этом роде, она только что называется один раз)Почему read() читает один байт за раз, если char равен 2 байтам?
ответ
Хороший вопрос! Вы правы, что в Java символы всегда два байта, но это неверно в другом месте (например, в содержимом файла).
Файл не кодируются «в„Unicode“, потому что Unicode является спецификацией, а не кодирование. Кодировки карты спецификации Unicode для некоторых последовательностей байт, а не все такие кодировки используют два байта символы. Java char
ы является UTF-16 который всегда имеет ширину в два байта, но многие файлы хранятся в виде UTF-8, который имеет переменную ширину, а символы ASCII - один байт, другие - два или более.
Более того, InputStream
предназначен для чтения двоичных данных, не символов, а двоичные данные (по существу) всегда читаются по одному байту за раз. Если вы хотите прочитать текст, вы переносите свой поток в aa Reader
(предпочтительно явно указывая кодировку, которая будет использоваться) для преобразования двоичных данных в текст. Внутри он будет вызывать read()
один или несколько раз, чтобы правильно построить символ из последовательности байтов на основе кодировки.
Потоки предназначены для чтения байтов, а не символов. Если вы хотите читать символы, используйте Reader
. Читатель будет читать символы по одному и будет обрабатывать символы, декодирующие из байтов: в зависимости от кодировки символов (и самого символа) символ может быть закодирован в один байт, два или даже больше.
- 1. Чтение файла 16 байт за один раз
- 2. C: Почему размер моей пиццы не равен 10 байтам?
- 3. Почему мой загруженный файл равен 0 байтам
- 4. Чтение 32 байт файла за один раз
- 5. читать один байт за один раз, используя poll/select
- 6. c socket: send() отправлять только 1 байт за один раз
- 7. filesize() всегда читает 0 байтов, хотя размер файла не равен 0 байтам
- 8. node.js - чтение дочернего процесса stdout 100 байт за один раз
- 9. Read возвращает 0 байт
- 10. Какой размер Целочисленный размер равен 4 байтам?
- 11. BufferedReader читает только один раз
- 12. Почему HDFS пишет один раз и читает несколько раз?
- 13. Включите только 2 переключателя за один раз
- 14. Java BufferedReader читает только один раз
- 15. Почему не удается обновить 2 поля за один раз?
- 16. Как использовать только 10 бит int, который равен 2 байтам?
- 17. Заменить 2 условия за один раз?
- 18. Чтение файла 2 символа за один раз
- 19. remove 2 subviews за один раз
- 20. Рельсы доступа 2 записи за один раз
- 21. Ловля 2 разных xmlhttp.responseText за один раз
- 22. Как получить доступ к нескольким элементам массива за один раз?
- 23. Сканер только читает цикл за один раз? - Java
- 24. Чтение массива байт за байт
- 25. Почему первый байт файла .png равен 0x89?
- 26. Один пользователь за раз
- 27. Почему этот драйвер char всегда копирует только один байт?
- 28. read() не читает полный ответ http
- 29. Прочитать весь файл или байт за один раз
- 30. BufferedReader читает только 61 байт
Он читает по одному байту за раз, потому что он задан для чтения по одному байту за раз. Если вам нужно иметь дело с Strings красиво, вам придется использовать декоратор. –
Не точный дубликат, но принятый ответ связанного вопроса объясняет разницу между чтением байтов и символами. –