Метод PrintStream write() в Java


person Rollerball    schedule 05.09.2013    source источник
comment
Двоичный 65 (в виде байта) представляет собой символ ASCII A.   -  person Sotirios Delimanolis    schedule 05.09.2013
comment
@Sotirios Delimanolis перечитал вопрос еще раз, он ожидает пятерку   -  person    schedule 05.09.2013
comment
write(65) выведет A в поток; print(65) выведет 65 в поток.   -  person Aleks G    schedule 05.09.2013
comment
Я думаю, что print(65) возьмет символ Unicode 65 (0x41), преобразует его, используя кодировку символов по умолчанию, в байты, а затем запишет эти байты. Если это UTF-8, это будет A. Фактически, во многих кодировках символов это будет A   -  person Lee Meador    schedule 05.09.2013
comment
@LeeMeador Я хотел бы знать разницу между записью байта как есть и использованием кодировки. Байт как есть, я бы ожидал, что что-то не закодировано. Однако A является результатом кодирования   -  person Rollerball    schedule 05.09.2013
comment
print() принимает типы char или String в качестве параметров. Это Юникод. write() принимает типы byte или byte[] в качестве параметров. Это просто сырые кусочки. Юникод можно расшифровать. Это заканчивается одним или несколькими байтами. Эти байты могут быть закодированы обратно в Unicode. write(byte) просто передает биты в файл. print(int) считает, что int является значением Unicode, декодирует его в байт или байты и передает этот байт или эти байты в файл.   -  person Lee Meador    schedule 05.09.2013
comment
print(0x0391) преобразует этот символ Unicode (греческая заглавная буква) в байты. Я не знаю, что это за байты, но могу предположить, что это два байта во многих кодировках. Эти два байта, если я прав, пойдут в файл.   -  person Lee Meador    schedule 05.09.2013
comment
поэтому запись (альфа-символ) должна записывать байты непосредственно в файл, верно?   -  person Rollerball    schedule 06.09.2013


Ответы (3)


дано

String s = "some string";
byte[] sData = s.getBytes();

write(sData, 0, sData.length); и print(s);

должны быть эквивалентны.

person Cruncher    schedule 05.09.2013

Двоичный 01000001 (byte) - это символ ASCII A, поэтому вы получаете его, когда читаете как String.

Вам нужно будет использовать FilterOutputStream.html#write(byte[])

write("65".getBytes());

чтобы получить тот же результат.

Или любой тип, который вам нужен

write(new Integer(65).toString().getBytes());

Что я должен написать в write(), чтобы не совпадало с print()? Не могли бы вы привести пример?

System.out.println(65); // writes 65 as a String, String.valueOf(65).getBytes()
System.out.write(65); // writes 65 as a byte
System.out.flush();

отпечатки

65 // the String value '65'
A // the character value of binary 65

Прочтите javadoc, чтобы узнать о print методах. Тот, что выше, принимает int и

Печатает целое число. Строка, создаваемая String.valueOf(int), преобразуется в байты в соответствии с кодировкой символов по умолчанию, используемой платформой, и эти байты записываются точно так же, как метод write(int).< /сильный>

В любом случае байты записываются в поток, но то, как они отображаются, зависит от того, как вы их читаете. String имеет конструкторы, которые принимают объекты charsetName или Charset. Charset (как концепция и как класс)

Именованное сопоставление между последовательностями шестнадцатибитных единиц кода Unicode и последовательностями байтов.

person Sotirios Delimanolis    schedule 05.09.2013

Если вы попытаетесь

writer.print('Ä');

вы можете получить разные результаты в зависимости от вашей платформы. Это может быть один байт для платформы с кодировкой Latin-1 по умолчанию или 2 байта для платформы с UTF-8.

person Michael Piefel    schedule 05.09.2013