/** ****************************************************************************** * 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; }