запись BitSet в файл в Java

Я встретился с той же проблемой и нашел очень легкое решение. Перейдите к следующей ссылке: http://msdn.microsoft.com/en-us/vs2008/bb968856.aspx

и выполненный инструмент VS AutoUninstall.This автоматически удалит все компоненты VS 2008.

Аплодисменты

7
задан Avner 4 September 2009 в 09:30
поделиться

4 ответа

Остальные байты будут информацией о типе.

В основном ObjectOutputStream - это класс, используемый для записи сериализуемых объектов в какое-то место назначения (обычно в файл). Это имеет больше смысла, если вы подумаете о InputObjectStream. На нем есть метод readObject (). Как Java знает, какой объект нужно создать? Легко: там есть информация о типе.

2
ответ дан 7 December 2019 в 16:44
поделиться

Формат сериализации, как и многие другие, включает заголовок с магическим номером и информацией о версии. При использовании DataOutput / OutputStream методы в ObjectOutputStream помещаются в середину сериализованных данных ( без информации о типе ). Обычно это делается только в реализациях writeObject после вызова defaultWriteObject или использования putFields .

0
ответ дан 7 December 2019 в 16:44
поделиться

Вы можете записывать любые объекты в ObjectOutputStream , поэтому поток будет содержать информацию о записанных типах, а также данные, необходимые для восстановления объекта.

Если вы знаете, что поток всегда будет содержать BitSet, не используйте ObjectOutputStream - а если пространство является дополнительным, преобразуйте BitSet в набор байтов, где каждый бит соответствует биту в BitSet , затем запишите его непосредственно в базовый поток (например, FileOutputStream , как в вашем примере).

1
ответ дан 7 December 2019 в 16:44
поделиться

Если вы используете только сохраненный BitSet в Java, сериализация работает нормально. Однако это немного раздражает, если вы хотите использовать битовый набор на нескольких платформах. Помимо накладных расходов на сериализацию Java, BitSet хранится в единицах по 8 байтов. Это может привести к слишком большим накладным расходам, если ваш битовый набор маленький.

Мы написали этот небольшой класс, чтобы мы могли извлекать байтовые массивы из 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<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];
    }
}
0
ответ дан 7 December 2019 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: