如何在用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字节]我已经用十六进制编辑器测试了这个文件。这就是我所发现的:

ac ed 20 05 77 1020 20 04 20 20 20 02 20 20 01 20 20 20 20 80

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

现在,我的问题是如何在Java中避免这些字节?为什么它们甚至被保存为原始类型?出于版本兼容性的目的,我的实际应用程序仍然有明确的头信息。出于任何目的,我都不需要来自Java的额外字节。尽管它是6字节,但它只是一种浪费。

来自ObjectOutputStream:的文档

基本数据(不包括可序列化字段和可外化数据)在块数据记录中写入ObjectOutputStream。块数据记录由标头和数据组成。块数据标头由一个标记和标头后面的字节数组成。连续的基元数据写入被合并到一个块数据记录中。用于块数据记录的块因子将是1024字节。每个块数据记录最多可填充1024个字节,或在块数据模式终止时写入。对ObjectOutputStream方法writeObject、defaultWriteObject和writeFields的调用最初终止任何现有的块数据记录。

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

相关内容

  • 没有找到相关文章

最新更新