2013-04-19 2 views
1
writer = new BufferedWriter(new OutputStreamWriter(System.out)); 
char[] test = new char[1]; 
test[0]=(char)128; 
writer.write(test,0,1); 
writer.flush(); 

Вызов с использованием этой команды; java File> outBufferedWriter, записывающий символ с MSB 1

, а затем изучая «выход» с шестнадцатеричным редактором, я ожидаю получить байт 0x80 в начале файла и ничего не последующего за ним. Вместо этого я получаю 0x3F. Выполняя тот же код с чем-то другим, т. Е. 64, я получаю ожидаемый гекс 0x40.

+0

'BufferedWriter' представляет собой поток символов ориентированный, используйте' BufferedOutputStream' вместо –

ответ

0

BufferedWriter - ориентированный на характер поток, поэтому записанные вами байты кодируются в нечто иное, что вы видите в файле. Используйте BufferedOutputStream, который предназначен для обработки таких типов двоичных данных.

+0

Ах да, это фиксированная, спасибо. Тот же принцип с BufferedReader? –

+0

@ChristianWright То же самое, 'BufferedInputStream' для двоичного и другого для символа. –

0

В этом случае OutputStreamWriter преобразует символы в байты, используя кодировку символов по умолчанию для платформы. Если вы хотите видеть 0x80 (128) в файле, используйте new OutputStreamWriter(System.out, "ISO-8859-1");

0

Согласно API Java 6 для BufferedWriter, в нем говорится: «Без буферизации каждый вызов метода print() приведет к преобразованию символов в байты, которые затем будет немедленно записано в файл, что может быть очень неэффективным ».

Для получения дополнительной информации на том же ваш может посетить the link

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