簡體   English   中英

java,用DataOutputStream寫入數據大小

[英]java, writing data size with DataOutputStream

我有一系列對象,它們通過 DataOutputStream 將數據寫入文件。

隨着我的應用程序文件格式的發展,我將向其中添加更多數據對象,這些對象應該能夠被“舊”版本的應用程序讀取。

為了能夠做到這一點,我需要在對象數據前面加上一個大小值,該值指示當前對象將占用的字節數。

但是,由於這些數據的大小可能是可變的,特別是在處理字符串時,我無法事先知道大小是多少。

有沒有辦法“預寫”到字節緩沖區,就好像它是一個 DataOutputStream (特別是方法 - writeByte, writeShort, writeInt, writeUTF ),這將使我能夠在寫入之前取回數據的字節長度到 DataOutputStream ? 這樣做將使我能夠跳過舊版本應用程序可以理解的新數據對象。

由於各種原因,常規 Java 序列化並不是那么好。 最重要的問題之一是它非常脆弱,而且往往不是“面向未來的證明”。 如果可能,我建議您使用不同的序列化格式,特別是如果您特別提到您計划向序列化的類添加字段。

諸如ProtobufJSON 之類的格式具有帶有良好 API 和良好的向前/向后兼容性功能的 Java 庫。 在大多數情況下,將數據序列化為更方便的格式要比解決現有格式的問題簡單得多。

正如你在這里看到的,你可以這樣使用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));
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM