【问题标题】:Why does ObjectOutputStream write 14 bytes instead of 8 with DataOutputStream?为什么 ObjectOutputStream 用 DataOutputStream 写入 14 个字节而不是 8 个字节?
【发布时间】:2018-11-13 12:04:06
【问题描述】:

ObjectOutputStream 和 DataOutputStream 中的同一个方法(writeInt())写入不同的数据?原始类型不应该是相等的吗?

        // Output: 14 bytes file
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("file_14bytes.bin"));
        out.writeInt(1);
        out.writeInt(2);
        out.close();

        // Output: 8 bytes file
        DataOutputStream dout= new DataOutputStream(new FileOutputStream("file_8bytes.bin"));
        dout.writeInt(3);
        dout.writeInt(4);
        dout.close();

例如,我想在第一次连接时使用 objectoutputstream 的 writeObject() 方法发送对象信息,然后使用 OOS 的 writeInt() 循环发送 x、y 浮点数。

【问题讨论】:

  • ObjectOutputStream 是您想要使用 Java 序列化的时候(由于包括安全考虑在内的多种原因,这有点不鼓励)。 DataOutputStream 是您想要完全控制如何写入每个字节的时候。从您的问题来看,您想使用后者。

标签: java networking objectoutputstream dataoutputstream


【解决方案1】:

ObjectOutputStream 设计用于写入对象,并在写入包括原语在内的任何信息时写入一些元数据。

OOS 也被缓冲,因此您可能看不到所有立即写入底层流的字节。

注意:writeInt 使用 4 个字节和 DataOutputStream。

使用OOS的writeInt()发送x,y在循环中浮动

我建议你使用 writeFloat(f) 来写浮点数。

如果你有一个浮点数组,我建议你使用 writeObject() 例如

oos.writeObject(someShape);
oos.writeObject(floatArray);

【讨论】:

    猜你喜欢
    • 2017-02-13
    • 1970-01-01
    • 2010-10-17
    • 2023-03-28
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多