/**
******************************************************************************
* HOMEWORK 15-211 COMPRESSION
******************************************************************************
*
* This class is for reading a sequence of bits in the stream
*
*
*****************************************************************************/
/*****************************************************************************
There is no need to modify this file.
*****************************************************************************/
package edu.cmu.cs211.compression.io;
import java.io.EOFException;
import java.io.IOException;
/**
* An interface to read data in bit, byte, or integer form.
*/
public interface BitReader {
/**
* Read the next bit in the stream
*
* @return a single bit (either 0 or 1), or -1 if the end of the stream is
* reached.
* @exception IOException
* thrown if their is an exception in the underlying stream
*/
public int readBit () throws IOException;
/**
* Read a sequence of bits in the stream The last bit read in will be bit 0
* of the int
*
* @param num
* the number of bits to read (max of 31)
* @return an integer built from the bits read in, or -1 if the end of the
* stream is reached
* @exception IOException
* thrown if their is an exception in the underlying stream
* @exception IllegalArgumentException
* thrown if the number of bits to read is out of range
*/
public int readBits (int num) throws IOException;
/**
* Reads the next byte of data from the input stream. The value byte is
* returned as an int
in the range 0
to
* 255
. If no byte is available because the end of the
* stream has been reached, the value -1
is returned. This
* method blocks until input data is available, the end of the stream is
* detected, or an exception is thrown.
*
* A subclass must provide an implementation of this method.
*
* @return the next byte of data, or -1
if the end of the
* stream is reached.
* @exception IOException
* if an I/O error occurs.
*/
public int readByte () throws IOException;
/**
* Reads up to len
bytes of data from the input stream into
* an array of bytes. An attempt is made to read as many as len
* bytes, but a smaller number may be read.
*
* If len
is zero, then no bytes are read and 0
* is returned; otherwise, there is an attempt to read at least one byte. If
* no byte is available because the stream is at end of file, the value
* -1
is returned; otherwise, at least one byte is read and
* stored into b
.
*
* The first byte read is stored into element b[off]
, the
* next one into b[off+1]
, and so on. The number of bytes
* read is, at most, equal to len
. Let k be the
* number of bytes actually read; these bytes will be stored in elements
* b[off]
through b[off+
k-1]
,
* leaving elements b[off+
k]
through
* b[off+len-1]
unaffected.
*
* In every case, elements b[0]
through b[off]
* and elements b[off+len]
through b[b.length-1]
* are unaffected.
*
* @param b
* the buffer into which the data is read.
* @param off
* the start offset in array b
at which the data
* is written.
* @param len
* the maximum number of bytes to read.
* @return the total number of bytes read into the buffer, or
* -1
if there is no more data because the end of the
* stream has been reached.
* @exception IOException
* if an I/O error occurs.
* @exception NullPointerException
* if b
is null
.
*/
public int readBytes (byte [] b, int off, int len) throws IOException;
/**
* Reads an integer in a compressed format that favors small, positive
* values.
*
* @return The integer read
* @throws IOException
* if an I/O error occurs
* @throws EOFException
* If the end of the stream is reached
*/
public int readInt () throws IOException;
/**
* The length of the stream
*/
public int length ();
/**
* Resets the reader to the beginning
*/
public void reset () throws IOException;
}