書BitSetのファイルのjava
-
21-09-2019 - |
質問
いBitSetと書きたいないファイルで出会った溶液を用いObjectOutputStreamのwriteObject方法です。
ご本人の了解のもと、掲載していObjectOutputStreamのjava APIでは見ることができその他のもの(バイトをint、shortなど)
私のクラスで書いてみましたbyteファイルに以下のコードが結果に与えられることになるファイルを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();
感謝の手
Avner
解決
他のバイトは、タイプ情報になります。
は基本的にObjectOutputStreamは、いくつかの宛先(通常はファイル)にシリアル化オブジェクトを書き込むために使用されるクラスです。それはあなたがInputObjectStream考えてみれば、より理にかなっています。それは上のreadObject()メソッドを持っています。どのようにJavaはどのようなオブジェクトインスタンス化するために、知っているのですか?簡単:型情報がそこにあります。
他のヒント
あなたがいずれかを書くことができが、ObjectOutputStream
に出てオブジェクトます。
あなたはストリームは常に、のBitSetが含まれていますObjectOutputStream
を使用していないことがわかっている場合は - とスペースが貴重である場合は、その後、BitSet
のビットへの各ビットの対応は、その後、バイトのセットにBitSet
を変換します直接その基になるストリームへの書き込み(例えばA FileOutputStream
あなたの例のように)。
のserialisation形式のように、多くの人は、ヘッダマジック番号とバージョン情報です。ご利用の際は DataOutput
/OutputStream
方法 ObjectOutputStream
の中のserialisedデータのないタイプ情報).これは一般的にのみ行われ writeObject
の実装を呼び出しの後に、あなたの defaultWriteObject
または使用 putFields
.
は、直列化は罰金を動作します。あなたはマルチプラットフォーム間でビットセットを共有したい場合は、それは一種迷惑なのです。 Javaのシリアライゼーションのオーバーヘッドに加え、たBitSetは8バイト単位で格納されます。あなたのビットセットが小さい場合、これはあまりにも多くのオーバーヘッドを生成することができます。
我々はのBitSetからバイト配列をexractことができるように私たちは、この小さなクラスを書きました。あなたのユースケースによっては、それはあなたのためのより良い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<n*8; i++) {
if (get(i))
setBit(i, bytes);
}
return bytes;
}
protected static int BIT_MASK[] =
{0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
protected static boolean isBitOn(int bit, byte[] bytes) {
int size = bytes == null ? 0 : bytes.length*8;
if (bit >= 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];
}
}