arn*_*bpl 2 java io file stream
首先,我没有使用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();
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我测试了创建的文件"Test.bin".filesize是22个字节.但是计算我实际写在文件中的内容,文件大小应该是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个字节,但它只是浪费.
小智 6
来自以下文件ObjectOutputStream
:
原始数据(不包括可序列化字段和可外部化数据)将写入块数据记录中的ObjectOutputStream.块数据记录由标题和数据组成.块数据头由标记和标头后面的字节数组成.连续的原始数据写入被合并到一个块数据记录中.用于块数据记录的阻塞因子将是1024字节.每个块数据记录将填充最多1024个字节,或者在块数据模式终止时写入.调用ObjectOutputStream方法writeObject,defaultWriteObject和writeFields最初终止任何现有的块数据记录.
如果你只想写byte
s,请使用a FileOutputStream
.