Какую кодировку символов использует метод writeObject объекта ObjectOutputStream? - PullRequest
4 голосов
/ 08 декабря 2010

Я прочитал, что Java использует внутреннюю кодировку UTF-16.т.е. я понимаю, что если у меня есть как: String var = "जनमत";тогда «जनमत» будет внутренне закодирован в UTF-16.Итак, если я дам эту переменную в какой-нибудь файл, такой как ниже:

fileOut = new FileOutputStream("output.xyz");
out = new ObjectOutputStream(fileOut);
out.writeObject(var);

, будет ли кодировка «जनमत» в файле «output.xyz» в UTF-16?Кроме того, позже, если я захочу прочитать из файла «output.xyz» через ObjectInputStream, смогу ли я получить представление переменной в UTF-16?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 08 декабря 2010

Итак, если я дам эту переменную в какой-нибудь файл ... будет ли кодировка строки "जनमत" в файле "output.xyz" в UTF-16?

Кодировка вашей строки в файле будет в любом формате, который ObjectOutputStream захочет вставить. Вы должны рассматривать его как черный ящик, который может быть прочитан только ObjectInputStream.(Серьезно - даже если формат IIRC хорошо документирован , если вы хотите прочитать его с помощью какого-либо другого инструмента, вам следует сериализовать объект самостоятельно как XML, JSON или любой другой.)

Позже, если я захочу прочитать из файла "output.xyz" через ObjectInputStream, смогу ли я получить UTF-16 представление переменной?

Если вы прочитаете файл с ObjectInputStream, вы получите обратно копию оригинального объекта.Это будет включать java.lang.String, который представляет собой простой поток символов (не байтов), из которого вы можете получить представление UTF-16, если хотите, с помощью метода getBytes () (хотя я подозреваю, что вына самом деле не нужно).


В заключение, не слишком переживайте по поводу внутренних деталей сериализации.Если вам нужно , чтобы узнать, что происходит, создайте файл самостоятельно;и если вам просто любопытно, верьте в JVM, чтобы поступать правильно.

1 голос
/ 08 декабря 2010

Закрыть: это не совсем UTF-16, а что-то вроде UCS-2;но в любом случае он использует 2 байта для большинства символов (и последовательность из 2 символов, то есть 4 байта для некоторых редко используемых кодовых точек).

ObjectOutputStream использует то, что называется измененным UTF-8, что похоже на UTF-8но где нулевой символ выражается в виде 2-байтовой последовательности, что недопустимо в соответствии с UTF-8 (из-за ограничений кодирования уникальности), но этот тип естественным образом декодирует обратно до значения 0.

Но что вына самом деле спрашиваю: «Это работает так, что я пишу строку, читаю строку» - и отвечаю на это да.JDK выполняет правильное кодирование при записи байтов и декодирование при чтении.

Для чего стоит, вам лучше использовать метод writeUTF () для Strings, так как я думаю, что полученный результат немного более компактен.но "writeObject ()" также работает, просто нужно немного больше метаданных.

0 голосов
/ 08 декабря 2010

Просто добавьте к этому, ObjectOutputStream.writeString() будет определять длину UTF данной строки и записывать ее в «стандартном» UTF или в «длинном» формате UTF, где «long», как указано в javadoc

«Длинный» формат UTF идентичен стандартному UTF, за исключением того, что он использует 8-байтовый заголовок (вместо стандартных 2 байтов) для передачи длины кодировки UTF.

Я получил этоиз кода ...

private void writeString(String str, boolean unshared) throws IOException {
    handles.assign(unshared ? null : str);
    long utflen = bout.getUTFLength(str);
    if (utflen <= 0xFFFF) {
        bout.writeByte(TC_STRING);
        bout.writeUTF(str, utflen);
    } else {
        bout.writeByte(TC_LONGSTRING);
        bout.writeLongUTF(str, utflen);
    }
}

и в writeObject(Object obj) они делают проверку

if (obj instanceof String) {
    writeString((String) obj, unshared);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...