Как я могу читать / записывать биты из / в файл на Java? - PullRequest
6 голосов
/ 03 декабря 2009

Мне нужно прочитать поток файлов как биты, и тогда я снова смогу записывать биты в файл. Есть ли для этого какие-то занятия?

Ответы [ 5 ]

6 голосов
/ 03 декабря 2009

Насколько я знаю, не существует встроенного способа сделать это непосредственно на уровне битов. Существуют способы чтения / записи побайтно, используя встроенные потоки. Вы можете написать оболочку для потока, который выглядит так, как будто он читает и записывает биты.

Если вы хотите что-то, что уже написано, ищите проекты с открытым исходным кодом, которые выполняют определенные виды аудио или видео кодирования, поскольку есть такие вещи. Например, кодек FLAC имеет BitInputStream, который может удовлетворить ваши потребности.

5 голосов
/ 03 декабря 2009

Я был очень доволен библиотекой colt из CERN. Не могу вспомнить, поддерживает ли он файловый ввод / вывод, но я использовал его для чтения битовых потоков, анализа и изменения их и записи обратно в файлы.

2 голосов
/ 28 мая 2013

Перемещено в https://github.com/jinahya/bit-io

Пожалуйста, посмотрите на http://jinahya.googlecode.com/svn/trunk/com.googlecode.jinahya/bit-io/src/main/java/com/googlecode/jinahya/io/

<dependency>
  <!-- resides in central repo -->
  <groupId>com.googlecode.jinahya</groupId>
  <artifactId>bit-io</artifactId>
  <version>1.0-alpha-13</version>
</dependency>

Это небольшая удобная библиотека для чтения / записи произвольной длины битов в Java.

final InputStream stream;
final BitInput input = new BitInput(new BitInput.StreamInput(stream));

final int b = input.readBoolean(); // reads a 1-bit boolean value
final int i = input.readUnsignedInt(3); // reads a 3-bit unsigned int
final long l = input.readLong(47); // reads a 47-bit signed long

input.align(1); // 8-bit byte align; padding


final WritableByteChannel channel;
final BitOutput output = new BitOutput(new BitOutput.ChannelOutput(channel));

output.writeBoolean(true); // writes a 1-bit boolean value
output.writeInt(17, 0x00); // writes a 17-bit signed int
output.writeUnsignedLong(54, 0x00L); // writes a 54-bit unsigned long

output.align(4); // 32-bit byte align; discarding
0 голосов
/ 29 декабря 2014

И просто для того, чтобы дать вам представление о том, как создать свою собственную потоковую оболочку, вот фрагмент кода.

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;

public class BitInputStream extends FilterInputStream {

    private int bitsBuffer = -1;

    private int remainingBits = 0;

    public BitInputStream(InputStream in) {
        super(in);
    }

    @Override
    public int read() throws IOException {
        if (remainingBits == 0) {
            bitsBuffer = in.read();
            remainingBits = Byte.SIZE;
        }
        if (bitsBuffer == -1) {
            return -1;
        }
        remainingBits--;
        return (bitsBuffer >> remainingBits) & 1;
    }

}

Как видите, метод read () переопределяется и возвращает 0 или 1, если бит доступен, или -1, если достигнут конец нижележащего потока.

import org.junit.Test;
import java.io.ByteArrayInputStream;
import static org.junit.Assert.assertEquals;

public class BitInputStreamTest {

    @Test
    public void read() throws Exception {
        // 99 in two's complement binary form is 01100011
        BitInputStream in = new BitInputStream(
          new ByteArrayInputStream(new byte[]{99}));

        assertEquals(0, in.read());
        assertEquals(1, in.read());
        assertEquals(1, in.read());
        assertEquals(0, in.read());

        assertEquals(0, in.read());
        assertEquals(0, in.read());
        assertEquals(1, in.read());
        assertEquals(1, in.read());

        assertEquals(-1, in.read());
    }

}
0 голосов
/ 03 января 2010

Преон может быть то, что вы ищете. Глядя на ваши вопросы, я могу представить, что Preon может быть даже на больше , чем то, что вы ищете.

Представьте, что Preon - это библиотека, предоставляющая битовый поток кодированного контента, которым Hibernate стремится стать для реляционных баз данных, а JAXB - для XML. Теперь существует несколько модулей. Один из этих модулей является preon-binding. Это фактическая структура привязки данных. (Управляется аннотациями.)

Однако preon-привязка строится поверх preon-bitbuffer (в более поздних воплощениях переименовывается в preon-io). Эта библиотека имеет тип абстракции BitBuffer для доступа к сжатым битовым данным.

альтернативный текст http://preon.flotsam.nl/images/layers.png

Релиз Preon прошлым летом еще не поддерживал кодирование. Это работа в процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...