Class OutputBitStream
 All Implemented Interfaces:
Closeable
,Flushable
,AutoCloseable
 Direct Known Subclasses:
DebugOutputBitStream
This class wraps any OutputStream
so that you can treat it as
bit stream. Constructors and methods closely resemble those of
OutputStream
. Data can be added to such a stream in several ways:
writing an integer or long in fixedwidth, unary, γ, δ, ζ and Golomb
coding, or providing a vector of bytes.
This class can also wrap a byte
array; this is much more lightweight than wrapping a FastByteArrayOutputStream
wrapping the array, but overflowing the array
will cause an IOException
.
Note that when writing using a vector of bytes bits are written in the natural way: the first bit is bit 7 of the first byte, the eighth bit is bit 0 of the first byte, the ninth bit is bit 7 of the second byte and so on. When writing integers using some coding, instead, the lower bits are considered for coding (in the fixedwidth case, the given number of bits, otherwise the lower bits starting from the most significant one).
The bit stream format
The bit streams written by this class are big endian. That is, the first bit of the stream is bit 7 of the first byte, the eightth bit is bit 0 of the first byte, the ninth bit is bit 7 of the second byte and so on.
Blocks of bits (such as coded integers) are written starting from the
most significant bit. In other words, if you take the first bytes of a stream
and print them in binary you will see exactly the sequence of bits you have
written. In particular, if you write 32bit integers you will get a stream
which is identical to the one produced by a DataOutput
.
Additional features:
 This class provides an internal buffer. By setting a buffer of length 0 at creation time, you can actually bypass the buffering system: Note, however, that several classes providing buffering have synchronised methods, so using a wrapper instead of the internal buffer is likely to lead to a performance drop.
 To work around the schizophrenic relationship between streams and random
access files in
java.io
, this class provides aflush()
method that bytealigns the streams, flushes to the underlying byte stream all data and resets the internal state. At this point, you can safely reposition the underlying stream and write again afterwards. For instance, this is safe and will perform as expected:FileOutputStream fos = new FileOutputStream(...); OutputBitStream obs = new OutputBitStream(fos); ... write operations on obs ... obs.flush(); fos.getChannel().position(...); ... other write operations on obs ...
As a commodity, an instance of this class will try to cast the underlying byte stream to a
RepositionableStream
and to fetch by reflection theFileChannel
underlying the given output stream, in this order. If either reference can be successfully fetched, you can use directly theposition()
method with argumentpos
with the same semantics of aflush()
, followed by a call toposition(pos / 8)
(where the latter method belongs either to the underlying stream or to its underlying file channel). The specified position must be byte aligned, as there is no clean way of reading a fraction of a byte with the current APIs. However, since the reflective checks are quite heavy they can be disabled using a suitable constructor.
This class is not synchronised. If multiple threads access an instance of this class concurrently, they must be synchronised externally.
 Since:
 0.1
 Author:
 Sebastiano Vigna
 See Also:

Field Summary
Modifier and TypeFieldDescriptionprotected int
Current number of bytes available in the byte buffer.protected byte[]
The stream buffer.static final int
The default size of the byte buffer in bytes (16Ki).static final int[]
protected final FileChannel
The cached file channel underlyingos
.protected int
Current number of free bits in the bit buffer (the bits in the buffer are stored high).static final int[]
static final int
protected final OutputStream
The underlyingOutputStream
.protected int
Current position in the byte buffer.protected long
Current position of the underlying output stream.protected final RepositionableStream
os
cast to a positionable stream.static final int[]
protected final boolean
True if we are wrapping an array.static final int[]

Constructor Summary
ModifierConstructorDescriptionprotected
This (nonpublic) constructor exists just to provide fake initialisation for classes such asDebugOutputBitStream
.OutputBitStream
(byte[] a) Creates a new output bit stream wrapping a given byte array.OutputBitStream
(File file) Creates a new output bit stream writing to a file.Creates a new output bit stream wrapping a given file output stream using a buffer of sizeDEFAULT_BUFFER_SIZE
.OutputBitStream
(FileOutputStream os, int bufSize) Creates a new output bit stream wrapping a given file output stream with a specified buffer size.OutputBitStream
(File file, int bufSize) Creates a new output bit stream writing to file.Creates a new output bit stream wrapping a given output stream using a buffer of sizeDEFAULT_BUFFER_SIZE
.OutputBitStream
(OutputStream os, boolean testForPosition) Creates a new output bit stream wrapping a given output stream using a buffer of sizeDEFAULT_BUFFER_SIZE
.OutputBitStream
(OutputStream os, int bufSize) Creates a new output bit stream wrapping a given output stream with a specified buffer size.OutputBitStream
(OutputStream os, int bufSize, boolean testForPosition) Creates a new output bit stream wrapping a given output stream with a specified buffer size.OutputBitStream
(String name) Creates a new output bit stream writing to a file.OutputBitStream
(String name, int bufSize) Creates a new output bit stream writing to file. 
Method Summary
Modifier and TypeMethodDescriptionint
align()
Aligns the stream.void
close()
Closes the bit stream.void
copyFrom
(InputBitStream ibs, long length) Copies a given number of bits from a given input bit stream into this output bit stream.void
flush()
Flushes the bit stream.void
position
(long position) Sets this stream bit position, if it is based on aRepositionableStream
or on aFileChannel
.long
write
(byte[] bits, long len) Writes a sequence of bits.long
write
(byte[] bits, long offset, long len) Writes a sequence of bits, starting from a given offset.int
Writes a sequence of bits emitted by a boolean iterator.int
writeBit
(boolean bit) Writes a bit.int
writeBit
(int bit) Writes a bit.protected long
writeByteOffset
(byte[] bits, int offset, long len) Writes a sequence of bits, starting from a given byte offset.int
writeDelta
(int x) Writes a natural number in δ coding.long
writeDeltas
(int[] a, int count) Writes a given amount of natural numbers in δ coding.int
writeGamma
(int x) Writes a natural number in γ coding.long
writeGammas
(int[] a, int count) Writes a given amount of natural numbers in γ coding.int
writeGolomb
(int x, int b) Writes a natural number in Golomb coding.int
writeGolomb
(int x, int b, int log2b) Writes a natural number in Golomb coding.int
writeInt
(int x, int len) Writes a fixed number of bits from an integer.int
writeLong
(long x, int len) Writes a fixed number of bits from a long.int
writeLongDelta
(long x) Writes a long natural number in δ coding.int
writeLongGamma
(long x) Writes a long natural number in γ coding.long
writeLongGolomb
(long x, long b) Writes a long natural number in Golomb coding.long
writeLongGolomb
(long x, long b, int log2b) Writes a long natural number in Golomb coding.int
writeLongMinimalBinary
(long x, long b) Writes a long natural number in a limited range using a minimal binary coding.int
writeLongMinimalBinary
(long x, long b, int log2b) Writes a long natural number in a limited range using a minimal binary coding.int
writeLongNibble
(long x) Writes a long natural number in variablelength nibble coding.int
writeLongShiftedGamma
(long x) Writes a long natural number in shifted γ coding.long
writeLongSkewedGolomb
(long x, long b) Writes a long natural number in skewed Golomb coding.long
writeLongUnary
(long x) Writes a long natural number in unary coding.int
writeLongZeta
(long x, int k) Writes a long natural number in ζ coding.int
writeMinimalBinary
(int x, int b) Writes a natural number in a limited range using a minimal binary coding.int
writeMinimalBinary
(int x, int b, int log2b) Writes a natural number in a limited range using a minimal binary coding.int
writeNibble
(int x) Writes a natural number in variablelength nibble coding.int
writeShiftedGamma
(int x) Writes a natural number in shifted γ coding.long
writeShiftedGammas
(int[] a, int count) Writes a given amount of natural numbers in shifted γ coding.int
writeSkewedGolomb
(int x, int b) Writes a natural number in skewed Golomb coding.int
writeUnary
(int x) Writes a natural number in unary coding.int
writeZeta
(int x, int k) Writes a natural number in ζ coding.long
Returns the number of bits written to this bit stream.void
writtenBits
(long writtenBits) Sets the number of bits written to this bit stream.

Field Details

MAX_PRECOMPUTED
public static final int MAX_PRECOMPUTED See Also:

GAMMA
public static final int[] GAMMA 
DELTA
public static final int[] DELTA 
ZETA_3
public static final int[] ZETA_3 
SHIFTED_GAMMA
public static final int[] SHIFTED_GAMMA 
DEFAULT_BUFFER_SIZE
public static final int DEFAULT_BUFFER_SIZEThe default size of the byte buffer in bytes (16Ki). See Also:

os
The underlyingOutputStream
. 
buffer
protected byte[] bufferThe stream buffer. 
free
protected int freeCurrent number of free bits in the bit buffer (the bits in the buffer are stored high). 
pos
protected int posCurrent position in the byte buffer. 
position
protected long positionCurrent position of the underlying output stream. 
avail
protected int availCurrent number of bytes available in the byte buffer. 
fileChannel
The cached file channel underlyingos
. 
repositionableStream
os
cast to a positionable stream. 
wrapping
protected final boolean wrappingTrue if we are wrapping an array.


Constructor Details

OutputBitStream
protected OutputBitStream()This (nonpublic) constructor exists just to provide fake initialisation for classes such asDebugOutputBitStream
. 
OutputBitStream
Creates a new output bit stream wrapping a given output stream using a buffer of sizeDEFAULT_BUFFER_SIZE
.This constructor performs the reflective tests that are necessary to support
position(long)
. Parameters:
os
 the output stream to wrap.

OutputBitStream
Creates a new output bit stream wrapping a given output stream using a buffer of sizeDEFAULT_BUFFER_SIZE
. Parameters:
os
 the output stream to wrap.testForPosition
 if false, the reflective test that is necessary to supportposition(long)
in caseos
does not supportRepositionableStream
will not be performed.

OutputBitStream
Creates a new output bit stream wrapping a given output stream with a specified buffer size.This constructor performs the reflective tests that are necessary to support
position(long)
. Parameters:
os
 the output stream to wrap.bufSize
 the size in byte of the buffer; it may be 0, denoting no buffering.

OutputBitStream
Creates a new output bit stream wrapping a given output stream with a specified buffer size. Parameters:
os
 the output stream to wrap.bufSize
 the size in byte of the buffer; it may be 0, denoting no buffering.testForPosition
 if false, the reflective test that is necessary to supportposition(long)
in caseos
does not supportRepositionableStream
will not be performed.

OutputBitStream
Creates a new output bit stream wrapping a given file output stream using a buffer of sizeDEFAULT_BUFFER_SIZE
.This constructor invokes directly
FileOutputStream.getChannel()
to supportposition(long)
. Parameters:
os
 the output stream to wrap.

OutputBitStream
Creates a new output bit stream wrapping a given file output stream with a specified buffer size.This constructor invokes directly
FileOutputStream.getChannel()
to supportposition(long)
. Parameters:
os
 the output stream to wrap.bufSize
 the size in byte of the buffer; it may be 0, denoting no buffering.

OutputBitStream
public OutputBitStream(byte[] a) Creates a new output bit stream wrapping a given byte array. Parameters:
a
 the byte array to wrap.

OutputBitStream
Creates a new output bit stream writing to file. Parameters:
name
 the name of the file.bufSize
 the size in byte of the buffer; it may be 0, denoting no buffering. Throws:
FileNotFoundException

OutputBitStream
Creates a new output bit stream writing to a file. Parameters:
name
 the name of the file. Throws:
FileNotFoundException

OutputBitStream
Creates a new output bit stream writing to file. Parameters:
file
 the file.bufSize
 the size in byte of the buffer; it may be 0, denoting no buffering. Throws:
FileNotFoundException

OutputBitStream
Creates a new output bit stream writing to a file. Parameters:
file
 the file. Throws:
FileNotFoundException


Method Details

flush
Flushes the bit stream.This method will align the stream, write the bit buffer, empty the byte buffer and delegate to the
OutputStream.flush()
method of the underlying output stream.This method is provided so that users of this class can easily wrap repositionable streams (for instance, filebased streams, which can be repositioned using the underlying
FileChannel
).It is guaranteed that after calling this method the underlying stream can be repositioned, and that the next write to the underlying output stream will start with the content of the first write method called afterwards.
 Specified by:
flush
in interfaceFlushable
 Throws:
IOException

close
Closes the bit stream. All resources associated with the stream are released. Specified by:
close
in interfaceAutoCloseable
 Specified by:
close
in interfaceCloseable
 Throws:
IOException

writtenBits
public long writtenBits()Returns the number of bits written to this bit stream. Returns:
 the number of bits written so far.

writtenBits
public void writtenBits(long writtenBits) Sets the number of bits written to this bit stream.This method is provided so that, for instance, the user can reset via
writtenBits(0)
the writtenbits count after aflush()
. Parameters:
writtenBits
 the new value for the number of bits written so far.

align
Aligns the stream. After a call to this method, the stream is byte aligned. Zeroes are used to pad it if necessary. Returns:
 the number of padding bits.
 Throws:
IOException

position
Sets this stream bit position, if it is based on aRepositionableStream
or on aFileChannel
.Given an underlying stream that implements
RepositionableStream
or that can provide aFileChannel
via thegetChannel()
method, a call to this method has the same semantics of aflush()
, followed by a call toposition(position / 8)
on the byte stream. Currently there is no clean, working way of supporting outofbyteboundary positioning. Parameters:
position
 the new position expressed as a bit offset; it must be bytealigned. Throws:
IllegalArgumentException
 when trying to position outside of byte boundaries.UnsupportedOperationException
 if the underlying byte stream does not implementRepositionableStream
and if the channel it returns is not aFileChannel
.IOException
 See Also:

write
Writes a sequence of bits. Bits will be written in the natural way: the first bit is bit 7 of the first byte, the eightth bit is bit 0 of the first byte, the ninth bit is bit 7 of the second byte and so on. Parameters:
bits
 a vector containing the bits to be written.len
 a bit length. Returns:
 the number of bits written (
len
).  Throws:
IOException

write
Writes a sequence of bits, starting from a given offset. Bits will be written in the natural way: the first bit is bit 7 of the first byte, the eightth bit is bit 0 of the first byte, the ninth bit is bit 7 of the second byte and so on. Parameters:
bits
 a vector containing the bits to be written.offset
 a bit offset from which to start to write.len
 a bit length. Returns:
 the number of bits written (
len
).  Throws:
IOException

writeByteOffset
Writes a sequence of bits, starting from a given byte offset. Bits will be written in the natural way: the first bit is bit 7 of the first byte, the eightth bit is bit 0 of the first byte, the ninth bit is bit 7 of the second byte and so on.This method is used to support methods such as
write(byte[], long, long)
. Parameters:
bits
 a vector containing the bits to be written.offset
 an offset, expressed in bytes.len
 a bit length. Returns:
 the number of bits written (
len
).  Throws:
IOException

writeBit
Writes a bit. Parameters:
bit
 a bit. Returns:
 the number of bits written.
 Throws:
IOException

writeBit
Writes a bit. Parameters:
bit
 a bit. Returns:
 the number of bits written.
 Throws:
IOException

write
Writes a sequence of bits emitted by a boolean iterator.If the iterator throws an exception, it is catched, and the return value is given by the number of bits written increased by one and with the sign changed.
 Parameters:
i
 a boolean iterator. Returns:
 if
i
did not throw a runtime exception, the number of bits written; otherwise, the number of bits written, plus one, with the sign changed.  Throws:
IOException

writeInt
Writes a fixed number of bits from an integer. Parameters:
x
 an integer.len
 a bit length; this many lower bits of the first argument will be written (the most significant bit first). Returns:
 the number of bits written (
len
).  Throws:
IOException

writeLong
Writes a fixed number of bits from a long. Parameters:
x
 a long.len
 a bit length; this many lower bits of the first argument will be written (the most significant bit first). Returns:
 the number of bits written (
len
).  Throws:
IOException

writeUnary
Writes a natural number in unary coding.The unary coding of a natural number n is given by 0^{n}1.
 Parameters:
x
 a natural number. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException

writeLongUnary
Writes a long natural number in unary coding. Parameters:
x
 a long natural number. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException
 See Also:

writeGamma
Writes a natural number in γ coding.The γ coding of a positive number of k bits is obtained writing k1 in unary, followed by the lower k1 bits of the number. The coding of a natural number is obtained by adding one and coding.
 Parameters:
x
 a natural number. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException

writeGammas
Writes a given amount of natural numbers in γ coding. Parameters:
a
 an array at leastcount
natural numbers.count
 the number of elements ofa
to be written. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException
 See Also:

writeLongGamma
Writes a long natural number in γ coding. Parameters:
x
 a long natural number. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException
 See Also:

writeShiftedGamma
Writes a natural number in shifted γ coding. The shifted γ coding of 0 is 1. The coding of a positive number of k bits is obtained writing k in unary, followed by the lower k1 bits of the number (equivalently, by writing k zeroes followed by the number). Parameters:
x
 a natural number. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException

writeLongShiftedGamma
Writes a long natural number in shifted γ coding. Parameters:
x
 a natural number. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException
 See Also:

writeShiftedGammas
Writes a given amount of natural numbers in shifted γ coding. Parameters:
a
 an array at leastcount
natural numbers.count
 the number of elements ofa
to be written. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException
 See Also:

writeDelta
Writes a natural number in δ coding. The δ coding of a positive number of k bits is obtained writing k1 in γ coding, followed by the lower k1 bits of the number. The coding of a natural number is obtained by adding one and coding. Parameters:
x
 a natural number. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException

writeLongDelta
Writes a long natural number in δ coding. Parameters:
x
 a long natural number. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException
 See Also:

writeDeltas
Writes a given amount of natural numbers in δ coding. Parameters:
a
 an array at leastcount
natural numbers.count
 the number of elements ofa
to be written. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException
 See Also:

writeMinimalBinary
Writes a natural number in a limited range using a minimal binary coding.A minimal binary code is an optimal code for the uniform distribution. This method uses an optimal code in which shorter words are assigned to smaller integers.
 Parameters:
x
 a natural number.b
 a strict upper bound forx
. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number or use a nonpositive base.IOException

writeMinimalBinary
Writes a natural number in a limited range using a minimal binary coding. This method is faster thanwriteMinimalBinary(int,int)
because it does not have to computelog2b
. Parameters:
x
 a natural number.b
 a strict upper bound forx
.log2b
 the floor of the base2 logarithm of the bound. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number or use a nonpositive base.IOException
 See Also:

writeLongMinimalBinary
Writes a long natural number in a limited range using a minimal binary coding. Parameters:
x
 a natural number.b
 a strict upper bound forx
. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number or use a nonpositive base.IOException
 See Also:

writeLongMinimalBinary
Writes a long natural number in a limited range using a minimal binary coding. This method is faster thanwriteLongMinimalBinary(long,long)
because it does not have to computelog2b
. Parameters:
x
 a long natural number.b
 a strict upper bound forx
.log2b
 the floor of the base2 logarithm of the bound. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number or use a nonpositive base.IOException
 See Also:

writeGolomb
Writes a natural number in Golomb coding.Golomb coding with modulo b writes a natural number x as the quotient of the division of x and b in unary, followed by the remainder in minimal binary code.
This method implements also the case in which
b
is 0: in this case, the argumentx
may only be zero, and nothing will be written. Parameters:
x
 a natural number.b
 the modulus for the coding. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number or use a negative modulus.IOException

writeGolomb
Writes a natural number in Golomb coding. This method is faster thanwriteGolomb(int,int)
because it does not have to computelog2b
. Parameters:
x
 a natural number.b
 the modulus for the coding.log2b
 the floor of the base2 logarithm of the coding modulus (it is irrelevant whenb
is zero). Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number or use a negative modulus.IOException
 See Also:

writeLongGolomb
Writes a long natural number in Golomb coding. Parameters:
x
 a long natural number.b
 the modulus for the coding. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number or use a negative modulus.IOException
 See Also:

writeLongGolomb
Writes a long natural number in Golomb coding. This method is faster thanwriteLongGolomb(long,long)
because it does not have to computelog2b
. Parameters:
x
 a long natural number.b
 the modulus for the coding.log2b
 the floor of the base2 logarithm of the coding modulus (it is irrelevant whenb
is zero). Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number or use a negative modulus.IOException
 See Also:

writeSkewedGolomb
Writes a natural number in skewed Golomb coding.This method implements also the case in which
b
is 0: in this case, the argumentx
may only be zero, and nothing will be written. Parameters:
x
 a natural number.b
 the modulus for the coding. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number or use a negative modulus.IOException

writeLongSkewedGolomb
Writes a long natural number in skewed Golomb coding.This method implements also the case in which
b
is 0: in this case, the argumentx
may only be zero, and nothing will be written. Parameters:
x
 a long natural number.b
 the modulus for the coding. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number or use a negative modulus.IOException
 See Also:

writeZeta
Writes a natural number in ζ coding.ζ coding (with modulo k) records positive numbers in the intervals [1,2^{k}1],[2^{k},2^{k+1}1],…,[2^{hk},2^{(h+1)k}1] by coding h in unary, followed by a minimal binary coding of the offset in the interval. The coding of a natural number is obtained by adding one and coding.
ζ codes were defined by Paolo Boldi and Sebastiano Vigna in “Codes for the World−Wide Web”, Internet Math., 2(4):405427, 2005. The paper contains also a detailed analysis.
 Parameters:
x
 a natural number.k
 the shrinking factor. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number or use a nonpositive shrinking factor.IOException

writeLongZeta
Writes a long natural number in ζ coding. Parameters:
x
 a long natural number.k
 the shrinking factor. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number or use a nonpositive shrinking factor.IOException
 See Also:

writeNibble
Writes a natural number in variablelength nibble coding.Variablelength nibble coding records a natural number by padding its binary representation to the left using zeroes, until its length is a multiple of three. Then, the resulting string is broken in blocks of 3 bits, and each block is prefixed with a bit, which is zero for all blocks except for the last one.
 Parameters:
x
 a natural number. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException

writeLongNibble
Writes a long natural number in variablelength nibble coding. Parameters:
x
 a long natural number. Returns:
 the number of bits written.
 Throws:
IllegalArgumentException
 if you try to write a negative number.IOException
 See Also:

copyFrom
Copies a given number of bits from a given input bit stream into this output bit stream. Parameters:
ibs
 an input bit stream.length
 the number of bits to copy. Throws:
EOFException
 if there are not enough bits to copy.IOException
