首先,我没有使用高水平Java默认序列化将对象写入文件中。我是manually在文件中写入一些基本类型变量。这是示例:
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 bytes。但是计算我实际在文件中写入的内容,文件大小应该是16 bytes. [int
每个为 4 个字节。 4int
变量。所以 4 * 4 = 16 字节。]
那么额外的是什么6 bytes? [22 - 16 = 6 字节] 我已经使用十六进制编辑器测试了该文件。这就是我发现的:
交流 20 05 77 1020 20 04 20 20 20 02 20 20 20 01 20 20 20 20 80
我用不同的代码测试了更多文件。我发现文件的前 5 个字节完全相同。第 6 个字节代表实际尺寸该文件应该是什么。在这个例子中,它是10
十六进制,即十进制 16 - 这是正确的。
现在,我的问题是如何在 Java 中避免这些字节?为什么即使对于原始类型也要保存它们?我的真实应用程序仍然具有用于版本兼容性目的的显式标头信息。我不需要 Java 的额外字节用于任何目的。虽然它是6 bytes,简直就是浪费。
从文档ObjectOutputStream http://docs.oracle.com/javase/8/docs/api/java/io/ObjectOutputStream.html:
原始数据(不包括可序列化字段和可外部化数据)以块数据记录的形式写入 ObjectOutputStream。块数据记录由头和数据组成。块数据标头由标记和标头后面的字节数组成。连续的原始数据写入被合并到一个块数据记录中。用于块数据记录的块因子将为 1024 字节。每个块数据记录最多将填充 1024 字节,或者在块数据模式终止时写入。对 ObjectOutputStream 方法 writeObject、defaultWriteObject 和 writeFields 的调用最初会终止任何现有的块数据记录。
如果你只想写byte
s,使用FileOutputStream http://docs.oracle.com/javase/8/docs/api/java/io/FileOutputStream.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)