繁体   English   中英

如何在用Java编写文件时避免多余的标头字节?

[英]How to avoid extra header bytes while writing a file in Java?

首先,我没有使用Java 的高级默认序列化在文件中写入对象。 我正在文件中手动编写一些原始类型变量。 这是示例:

public class TestMain {
    public static void main(String[] args) {
        ObjectOutputStream out = null;
        try {
            out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("Test.bin")));

            out.writeInt(1024);
            out.writeInt(512);
            out.writeInt(256);
            out.writeInt(128);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

现在,我已经测试了创建的文件“ Test.bin”。 文件大小为22个字节 但是计算我实际写在文件中的内容后,文件大小应该为16个字节 [ int每个是4个字节。 4个int变量。 因此4 * 4 = 16个字节。]

那么,额外的6个字节是多少? [22-16 = 6个字节]我已经使用十六进制编辑器测试了该文件。 那就是我发现的:

aced 20 05 77 10 20 20 04 20 20 20 02 20 20 20 01 20 20 20 20 80

我已经用不同的代码测试了更多文件。 我发现文件的前5个字节完全相同。 第6个字节代表文件的实际大小 在此示例中,十六进制为10 ,十进制为16-是正确的。

现在,我的问题是如何避免Java中的这些字节? 为什么甚至为原始类型保存它们? 我的真实应用程序仍然具有用于版本兼容性目的的显式标头信息。 我不需要出于任何目的使用Java的多余字节。 尽管它是6个字节 ,但这只是浪费。

ObjectOutputStream的文档中:

除可序列化的字段和可外部化的数据外,原始数据在块数据记录中写入ObjectOutputStream。 块数据记录由标题和数据组成。 块数据标头由标记和跟随标头的字节数组成。 连续的原始数据写入将合并到一个块数据记录中。 用于块数据记录的块因子为1024字节。 每个块数据记录将最多填充1024个字节,或者在块数据模式终止时写入。 最初,调用ObjectOutputStream方法writeObject,defaultWriteObject和writeFields会终止任何现有的块数据记录。

如果只想写入byte ,请使用FileOutputStream

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM