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

如何在用Java编写文件时避免额外的头字节?,java,file,io,stream,Java,File,Io,Stream,首先,我没有使用Java的高级默认序列化在文件中写入对象。我正在文件中手动编写一些基本类型变量。以下是一个例子: public class TestMain { public static void main(String[] args) { ObjectOutputStream out = null; try { out = new ObjectOutputStream(new BufferedOutputStream(new F

首先,我没有使用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 02 20 20 01 20 20 80

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

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

来自以下文档:

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


如果您只想写入
字节
s,请使用。

然后我必须手动实现
readInt
readDouble
等方法?是否正确?除非所有元素都具有固定宽度,否则您需要一些元数据。我还可以通过串行读写避免所有具有固定宽度的元素的元数据。我知道我必须实现
writeInt
writeDouble
等方法,因为
FileOutputStream
只支持
byte
byte[]
。我想,与其使用
FileOutputStream
,不如使用
FileOutputStream
,出于性能原因,我应该使用
BufferedOutputStream
。使用与FileInput/OutputStream链接的DataInput/OutputStream来获取将原语作为二进制数据读写的方法。如果需要,也可以添加BufferedInput/OutputStream。