在Java中编写文件时如何避免额外的头字节?

时间:2015-02-18 12:00:51

标签: java file io stream

首先,我没有使用高级默认的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"。 filesize是 22个字节。但是计算我在文件中实际写入的内容,filesize应该是 16个字节。 [int每个4个字节。 4 int个变量。所以4 * 4 = 16个字节。]

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

  

ac ed 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个字节,但这简直是浪费。

1 个答案:

答案 0 :(得分:6)

来自ObjectOutputStream的文档:

  

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

如果您只想撰写byte,请使用FileOutputStream