[英]How to avoid extra header bytes while writing a file in Java?
首先,我没有使用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个字节]我已经使用十六进制编辑器测试了该文件。 那就是我发现的:
aced 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个字节 ,但这只是浪费。
从ObjectOutputStream
的文档中:
除可序列化的字段和可外部化的数据外,原始数据在块数据记录中写入ObjectOutputStream。 块数据记录由标题和数据组成。 块数据标头由标记和跟随标头的字节数组成。 连续的原始数据写入将合并到一个块数据记录中。 用于块数据记录的块因子为1024字节。 每个块数据记录将最多填充1024个字节,或者在块数据模式终止时写入。 最初,调用ObjectOutputStream方法writeObject,defaultWriteObject和writeFields会终止任何现有的块数据记录。
如果只想写入byte
,请使用FileOutputStream
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.