将BitSet写入java中的文件

我有一个BitSet,并希望将其写入文件 – 我遇到了使用writeObject方法使用ObjectOutputStream的解决方案。

我查看了java API中的ObjectOutputStream,看到你可以编写其他东西(byte,int,short等)

我试着检查这个类,所以我尝试使用以下代码将一个字节写入文件,但结果给了我一个7字节而不是1字节的文件

我的问题是文件中的前6个字节是什么? 他们为什么在那里?

我的问题与BitSet有关,因为我不想开始将大量数据写入文件,并意识到我在文件中插入随机字节而不知道它们是什么。

这是代码:

byte[] bt = new byte[]{'A'}; File outFile = new File("testOut.txt"); FileOutputStream fos = new FileOutputStream(outFile); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.write(bt); oos.close(); 

谢谢你的帮助

阿夫纳

其他字节将是类型信息。

基本上,ObjectOutputStream是一个用于将Serializable对象写入某个目标(通常是文件)的类。 如果你考虑一下InputObjectStream会更有意义。 它上面有一个readObject()方法。 Java如何知道要实例化的Object? 简单:那里有类型信息。

您可以将任何对象写入ObjectOutputStream ,因此该流包含有关所写类型的信息以及重构该对象所需的数据。

如果您知道流将始终包含BitSet,请不要使用ObjectOutputStream – 如果空间是溢价,则将BitSet转换为一组字节,其中每个位对应于BitSet一个位,然后直接写入到底层流(例如,在您的示例中为FileOutputStream )。

与许多其他格式一样,序列化格式包括带有幻数和版本信息的标题。 当您使用ObjectOutputStream上的DataOutput / OutputStream方法放置在序列化数据的中间( 没有类型信息 )。 这通常仅在调用defaultWriteObject或使用putFields之后在writeObject实现中putFields

如果您只使用Java中保存的BitSet,序列化工作正常。 但是,如果你想在多平台上共享bitset,那就太烦人了。 除了Java序列化的开销之外,BitSet以8字节为单位存储。 如果你的bitset很小,这可能会产生太多的开销。

我们编写了这个小类,因此我们可以从BitSet中提取字节数组。 根据您的用例,它可能比Java序列化更好。

 public class ExportableBitSet extends BitSet { private static final long serialVersionUID = 1L; public ExportableBitSet() { super(); } public ExportableBitSet(int nbits) { super(nbits); } public ExportableBitSet(byte[] bytes) { this(bytes == null? 0 : bytes.length*8); for (int i = 0; i < size(); i++) { if (isBitOn(i, bytes)) set(i); } } public byte[] toByteArray() { if (size() == 0) return new byte[0]; // Find highest bit int hiBit = -1; for (int i = 0; i < size(); i++) { if (get(i)) hiBit = i; } int n = (hiBit + 8) / 8; byte[] bytes = new byte[n]; if (n == 0) return bytes; Arrays.fill(bytes, (byte)0); for (int i=0; i= size) return false; return (bytes[bit/8] & BIT_MASK[bit%8]) != 0; } protected static void setBit(int bit, byte[] bytes) { int size = bytes == null ? 0 : bytes.length*8; if (bit >= size) throw new ArrayIndexOutOfBoundsException("Byte array too small"); bytes[bit/8] |= BIT_MASK[bit%8]; } }