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

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

首先,我没有使用 high-level 默认序列化 Java 在文件中写入 object。我正在 手动 在文件中写入一些原始类型变量。这是示例:

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 10 20 20 04 20 20 20 02 20 20 20 01 20 20 20 20 80

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

现在,我的问题是如何避免 Java 中的这些字节?为什么即使是原始类型也要保存它们?我的真实应用程序仍然有明确的 header 信息用于版本兼容性目的。出于任何目的,我不需要来自 Java 的额外字节。虽然是6字节,但是简直是浪费

来自 ObjectOutputStream 的文档:

Primitive data, excluding serializable fields and externalizable data, is written to the ObjectOutputStream in block-data records. A block data record is composed of a header and data. The block data header consists of a marker and the number of bytes to follow the header. Consecutive primitive data writes are merged into one block-data record. The blocking factor used for a block-data record will be 1024 bytes. Each block-data record will be filled up to 1024 bytes, or be written whenever there is a termination of block-data mode. Calls to the ObjectOutputStream methods writeObject, defaultWriteObject and writeFields initially terminate any existing block-data record.

如果您只想写 bytes,请使用 FileOutputStream