BufferedWriter # write (int) запрос javadoc - PullRequest
       15

BufferedWriter # write (int) запрос javadoc

0 голосов
/ 07 сентября 2010

Javadoc для этого говорит:

Только два младших байта целого oneChar записываются.

Какой эффект, если таковой имеется, имеет ли это при записи символы в кодировке не-utf8, приведенные к типу int?

Обновление:

Данный код получает данные из сокета и записывает их в файл.(Многое происходит между получением и записью, поэтому я не могу просто использовать полученную строку, используя BufferedReader # readLine ()).Я использовал Writer # write (char []), но это означало, что мне приходилось каждый раз создавать новый массив символов.Чтобы обойти создание массива каждый раз, у меня был один массив char, который заполнен -1 (приведен к char).

Затем я использую TextUtils # getChars , чтобы заполнить его, при необходимости расширив массив.Для записи я перебираю массив, записывая в Writer, пока char [i] == (char) -1 == true.

1 Ответ

0 голосов
/ 07 сентября 2010

Внутри write(int) просто приведёт свой параметр к char, поэтому write(i) эквивалентно write((char)i).

Теперь в Java внутренне char - это просто целочисленный тип с диапазоном 0-65535 (т.е. 16 бит).Преобразование int -> char является «сужающимся примитивным преобразованием» ( спецификация языка Java, 5.1.3 ), а int является целым числом со знаком, следовательно:

Aсужающее преобразование целого числа со знаком в целочисленный тип T просто отбрасывает все биты, кроме n младших разрядов, где n - количество битов, используемых для представления типа T. В дополнение к возможной потере информации о величине числового значения,это может привести к тому, что знак полученного значения будет отличаться от знака входного значения.

Именно поэтому Javadoc говорит, что записаны только два младших байта.

Теперь,что это означает с точки зрения символов, зависит от того, как вы хотите интерпретировать значения int.char в Java представляет кодовую точку Unicode в UTF-16, то есть 16-битное число, представленное символом, интерпретируется как номер кодовой точки Unicode.Поэтому, если каждое из ваших значений int является номером 16-битной кодовой точки, у вас все в порядке (на самом деле, это верно только для символов в BMP; если вы используете символы в дополнительных плоскостях, каждая кодовая точка Unicode будет закодированана две char с).Если это что-то еще (включая кодовую точку с более чем 16-разрядным или отрицательным числом или что-то еще целиком), вы получите мусор.

Как это влияет, если таковые имеются, на написание не-utf8 символов, которые были преобразованы в int?

Не существует такого понятия, как "non"-utf8 char ".UTF-8 - это кодировка , которая представляет собой способ представления кодовой точки Unicode, поэтому поставленный вопрос не имеет смысла.Может быть, вы могли бы объяснить, что делает ваш код?

...