ObjectOutputStream的writeObject方法使用什么字符编码?

bik*_*shg 4 java objectoutputstream utf-16 character-encoding fileoutputstream

我读到Java在内部使用UTF-16编码。即我明白,如果我喜欢:String var =“ ????”; 然后是“ ????” 将在内部以UTF-16编码。因此,如果我将此变量转储到某些文件中,例如:

fileOut = new FileOutputStream("output.xyz");
out = new ObjectOutputStream(fileOut);
out.writeObject(var);
Run Code Online (Sandbox Code Playgroud)

字符串“ ????”的编码 在文件“ output.xyz”中是否为UTF-16?另外,稍后,如果我想通过ObjectInputStream从文件“ output.xyz”中读取信息,是否可以获取该变量的UTF-16表示形式?

谢谢。

And*_*yle 6

因此,如果我将此变量转储到某个文件中,则字符串“ ????”的编码会不会 在文件“ output.xyz”中是否为UTF-16?

文件中字符串的编码将采用ObjectOutputStream想要放入的任何格式。您应将其视为只能由读取的黑盒ObjectInputStream。(严重的是-即使IIRC格式有充分的文档证明,如果您使用其他工具来读取它,也应该自己将该对象序列化为XML或JSON或其他格式。)

稍后,如果我想通过ObjectInputStream读取文件“ output.xyz”,是否可以获取变量的UTF-16表示形式?

如果您使用读取文件,则将ObjectInputStream获得原始对象的副本。这将包括一个java.lang.String,它只是字符流(不是字节)-如果希望通过getBytes()方法从中获取UTF-16表示形式(尽管我怀疑您实际上并不需要)。


总之,不必过多担心序列化的内部细节。如果您需要了解发生了什么,请自己创建文件。如果您只是好奇,请相信JVM做正确的事。


Sta*_*Man 1

关闭:它并不完全是UTF-16,而是类似UCS-2的东西;但无论哪种方式,它确实对大多数字符使用 2 个字节(以及 2 个字符的序列,即对一些很少使用的代码点使用 4 个字节)。

ObjectOutputStream 使用一种称为“修改的 UTF-8”的东西,它类似于 UTF-8,但其中零字符表示为 2 字节序列,这对于 UTF-8 来说是不合法的(由于编码的唯一性限制),但这种自然解码返回到值 0。

但你真正要问的是“我写一个字符串、读取一个字符串是否有效”——答案是肯定的。JDK 在写出字节时进行正确的编码,在读取时进行解码。

就其价值而言,您最好对字符串使用“writeUTF()”方法,因为我认为结果输出更紧凑。但“writeObject()”也可以工作,只是需要更多的元数据。