質問

い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を使用する場合は、

は、直列化は罰金を動作します。あなたはマルチプラットフォーム間でビットセットを共有したい場合は、それは一種迷惑なのです。 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];
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top