首先,我没有使用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
。