EJP прав. Более подробное объяснение: у персонажа есть два свойства, а вы пропускаете одно: Кодировка.
Это означает, что char myChar = 158
назначает myChar
кодовую точку Unicode 158 (это не печатный символ в Unicode).
Когда вы записываете это в файл в виде байта (используя fileOut.write(int)
), вы конвертируете символ Unicode в целое число 158
- кодировка теряется. Метод write()
удаляет из целого числа все, кроме младших 8 бит (write(158+256)
дает тот же результат, что и write(158)
).
Когда вы снова читаете данные, вы используете Reader
, который читает байты и преобразует их в символы Юникода. Чтобы сделать это правильно, вам нужно указать кодировку, с которой были записаны данные. Поскольку вы ничего не указали явно, Java использует кодировку платформы по умолчанию (по умолчанию для вашей ОС).
Таким образом, читатель читает 158
и использует кодировку по умолчанию, чтобы превратить это в char
.
Чтобы исправить это, всегда используйте Reader
/ Writer
вместе с InputStreamReader
и OutputStreamWriter
, которые позволяют вам указать, какую кодировку использовать. UTF-8
- хороший выбор, поскольку все виртуальные машины Java могут их читать, а все символы Unicode можно переводить в / из этой кодировки.