如何在 Java 中写入文件时避免额外的 header 字节?
How to avoid extra header bytes while writing a file in Java?
首先,我没有使用 high-level 默认序列化 Java 在文件中写入 object。我正在 手动 在文件中写入一些原始类型变量。这是示例:
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 10 20 20 04 20 20 20 02 20 20 20 01 20 20 20 20 80
我用不同的代码测试了更多的文件。我发现文件的前 5 个字节完全相同。第 6 个字节表示 实际大小 文件应该是什么。在此示例中,它是十六进制的 10
,即十进制的 16 - 这是正确的。
现在,我的问题是如何避免 Java 中的这些字节?为什么即使是原始类型也要保存它们?我的真实应用程序仍然有明确的 header 信息用于版本兼容性目的。出于任何目的,我不需要来自 Java 的额外字节。虽然是6字节,但是简直是浪费
来自 ObjectOutputStream
的文档:
Primitive data, excluding serializable fields and externalizable data, is written to the ObjectOutputStream in block-data records. A block data record is composed of a header and data. The block data header consists of a marker and the number of bytes to follow the header. Consecutive primitive data writes are merged into one block-data record. The blocking factor used for a block-data record will be 1024 bytes. Each block-data record will be filled up to 1024 bytes, or be written whenever there is a termination of block-data mode. Calls to the ObjectOutputStream methods writeObject, defaultWriteObject and writeFields initially terminate any existing block-data record.
如果您只想写 byte
s,请使用 FileOutputStream
。
首先,我没有使用 high-level 默认序列化 Java 在文件中写入 object。我正在 手动 在文件中写入一些原始类型变量。这是示例:
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 10 20 20 04 20 20 20 02 20 20 20 01 20 20 20 20 80
我用不同的代码测试了更多的文件。我发现文件的前 5 个字节完全相同。第 6 个字节表示 实际大小 文件应该是什么。在此示例中,它是十六进制的 10
,即十进制的 16 - 这是正确的。
现在,我的问题是如何避免 Java 中的这些字节?为什么即使是原始类型也要保存它们?我的真实应用程序仍然有明确的 header 信息用于版本兼容性目的。出于任何目的,我不需要来自 Java 的额外字节。虽然是6字节,但是简直是浪费
来自 ObjectOutputStream
的文档:
Primitive data, excluding serializable fields and externalizable data, is written to the ObjectOutputStream in block-data records. A block data record is composed of a header and data. The block data header consists of a marker and the number of bytes to follow the header. Consecutive primitive data writes are merged into one block-data record. The blocking factor used for a block-data record will be 1024 bytes. Each block-data record will be filled up to 1024 bytes, or be written whenever there is a termination of block-data mode. Calls to the ObjectOutputStream methods writeObject, defaultWriteObject and writeFields initially terminate any existing block-data record.
如果您只想写 byte
s,请使用 FileOutputStream
。