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

arn*_*bpl 2 java io file 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();
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我测试了创建的文件"Test.bin".filesize是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中避免这些字节?为什么即使是原始类型也能保存它们?我的真实应用程序仍具有版本兼容性目的的显式标头信息.出于任何目的,我不需要Java中的额外字节.虽然它是6个字节,但它只是浪费.

小智 6

来自以下文件ObjectOutputStream:

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

如果你只想写bytes,请使用a FileOutputStream.