java,使用DataOutputStream编写数据大小

时间:2016-10-17 18:58:52

标签: java outputstream dataoutputstream

我有一系列对象,它们通过DataOutputStream将数据写入文件。

随着我的应用程序文件格式的发展,我将向其中添加更多数据对象,这些对象应该可以被更早的数据对象读取。应用程序的版本。

为了能够做到这一点,我需要在对象数据前面加上一个大小值,表示当前对象将占用的字节数。

但是,由于这些数据可以是一个可变大小,特别是在处理字符串时,我无法事先知道它的大小。

有没有办法预先写"到一个字节缓冲区,好像它是一个DataOutputStream(特别是方法 - writeByte,writeShort,writeInt,writeUTF ),这将使我能够在将数据写入之前返回数据的字节长度。 DataOutputStream?这样做可以让我跳过旧版本的应用程序理解的新数据对象。

2 个答案:

答案 0 :(得分:1)

由于各种原因,常规Java序列化并不是那么好。其中最重要的一点是它非常脆弱,并且往往不是“未来证据”。如果可能的话,我建议你使用不同的序列化格式,特别是如果你特别提到你计划在你序列化的类中添加字段。

ProtobufJSON等格式的Java库具有良好的API,以及良好的前向/后向兼容性功能。在大多数情况下,将数据序列化为更方便的格式要比解决现有问题简单得多。

答案 1 :(得分:0)

正如您所见here,您可以这样使用java.lang.instrument.Instrumentation

import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

然后计算对象的字节大小:

public static void main(String [] args) {
   Object myObject = ...;
        System.out.println(ObjectSizeFetcher.getObjectSize(myObject));
    }