首先,我没有使用高级默认的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个字节,但这简直是浪费。
答案 0 :(得分:6)
来自ObjectOutputStream
的文档:
原始数据(不包括可序列化字段和可外部化数据)将写入块数据记录中的ObjectOutputStream。块数据记录由标题和数据组成。块数据头由标记和标头后面的字节数组成。连续的原始数据写入被合并到一个块数据记录中。用于块数据记录的阻塞因子将是1024字节。每个块数据记录将填充最多1024个字节,或者在块数据模式终止时写入。调用ObjectOutputStream方法writeObject,defaultWriteObject和writeFields最初会终止任何现有的块数据记录。
如果您只想撰写byte
,请使用FileOutputStream
。