son*_*oom 1 java objectoutputstream bytearrayoutputstream
将对象写入ByteArrayOutputStream时,我得到了一些奇怪的结果.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(baos);
os.writeObject(null);
byte[] objectBytes = baos.toByteArray();
int objectSize = objectBytes.length;
Run Code Online (Sandbox Code Playgroud)
所以我给ByteArrayOutputStream写了一个null,然后当我从这个流中检索字节而不是找到0个字节时,我发现有5个.字节的值如下 -
如果我更改os.writeObject(null)为os.writeObject("A")我得到8个字节,这些是 -
那么这里发生了什么,如果我写0字节,我希望在检索字节数组时找到字节.然后我看到它增加了5个字节.因此,当我写"A"时,我希望它在字节数组中返回6个字节,但它返回8.这里发生了什么?
Cyr*_* Ka 11
首先,你写作时没有写任何东西null.您正在写一个空值.序列化过程必须确保在反序列化时,您将null返回,因此必须以某种方式表示.开始时可能还有开销标记流的开始.
当你写"A"时,你也不只是把"A"字符.您正在序列化一个完整的String对象.这必须包含反序列化程序的信息,以便稍后重建具有相同值的String对象.所以有类型信息和内容.内容本身也将占用多个字节,因为Java将内部String表示为一个数组char,其中包含2个字节的值,并且还因为字符串的长度必须以某种方式编码(实际上我甚至对它们感到惊讶) '把所有这些只用了8个字节).
编辑:我已经看过这个页面上的解释.我们可以用它来了解您获得的结果.
在第一个示例中,您有以下字节:
在您的第二个示例中,实际上您提供的值不对应.我自己尝试了你的代码,并获得了:
对于最后一个字节,我显然有点不对劲:即使Java在内部使用2字节表示形式的char,它也会使用UTF8编码String,它只使用一个字节作为字符"A".
格式中的所有特殊值都是ObjectStreamConstants类中的常量