6


0

Javaでファイルからビットを読み書きするにはどうすればよいですか?

ファイルストリームをビットとして読み取る必要があり、その後、ファイルにビットを再び書き込むことができます。 この目的のためのクラスはありますか?

5 Answer


6


私の知る限り、ビットレベルで直接それを行う方法は組み込まれていません。 組み込みストリームを使用して、バイト単位で読み取り/書き込みを行う方法があります。 ビットを読み書きするように見えるラッパーをストリームに書き込むことができます。

すでに作成されているものが必要な場合は、特定の種類のオーディオまたはビデオエンコーディングを行うオープンソースプロジェクトを探してください。 たとえば、FLACコーデックには、ニーズに合ったBitInputStreamがありました。


5


CERNのhttp://acs.lbl.gov/~hoschek/colt/[colt]ライブラリにかなり満足していました。 ファイルI / Oをサポートしているかどうかは思い出せませんが、ビットストリームの読み取り、分析と変更、およびファイルへの書き込みに使用しました。


2


  com.googlecode.jinahya
  bit-io
  1.0-alpha-13

これは、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


Preonはあなたが探しているものかもしれません。 あなたの質問を見ると、Preonはあなたが探しているものよりも「もっと」あるかもしれないと想像できます。

Preonは、HibernateがリレーショナルデータベースやJAXBからXMLに向けたものをビットストリームでエンコードされたコンテンツに提供するライブラリと考えてください。 現在、いくつかのモジュールが存在します。 それらのモジュールの1つはプリオンバインディングです。 それが実際のデータバインディングフレームワークです。 (注釈によって駆動されます。)

ただし、preon-bindingはpreon-bitbufferの上に構築されます(後のincarnationではpreon-ioに再吹き替えされます)。 このライブラリには、ビットストリーム圧縮データにアクセスするためのBitBufferタイプの抽象化があります。

昨年の夏のPreonリリースでは、まだエンコードがサポートされていません。 それは進行中の作業です。


0


また、独自のストリームラッパーを作成する方法のアイデアを示すために、コードスニペットを示します。

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());
    }

}