JAXB Marshaller 计算在将对象写入文件之前将对象写入文件需要多少 space

JAXB Marshaller count how much space it takes to write object to file before writing it to a file

我正在

上寻找问题的解决方案

如何计算在将对象写入文件之前将对象写入文件需要多少space

我正在寻找的伪代码是

if (alreadyMarshalled.size() + toBeMarshalled.size() < 40 KB) {
    alreadyMarshalled.marshall(toBeMarshalled);
}

所以,我可以使用来自 Apache CountingOutputStream 的计数流,但是 起初我需要知道对象需要多少 space(包括标签), 但是我之前不知道如何在该计数中包含标签和前缀 检查已经编组的内容。有没有图书馆可以 解决这样的情况?

唯一的判断方法是实际编组 XML。

CountingOutputStream 的想法是正确的。

    NullOutputStream nos = new NullOutputStream();
    CountingOutputStream cos = new CountingOutputStream(nos);
    OutputStreamWriter osw = new OutputStreamWriter(cos);
    jaxbMarshaller.marshal(object, osw);
    long result = cos.getByteCount();

您必须 运行 这两次(一次计算计数,再写一次)这是唯一确定性的方法,而且不会占用您任何实际内存。

如果您不担心内存,那么只需将它转储到一个 ByteArrayOutputStream,如果您决定“保留它”,您可以直接将字节数组转储到文件中而不必 运行 再次通过编组器。

实际上有了ByteArrayOutputStream,你就不需要CountingOutputStream了,你可以在完成后找出结果数组的大小。但它的内存成本很高。