package com.sleepycat.util; import java.io.IOException; import java.io.InputStream; import de.ovgu.cide.jakutil.*; /** * A replacement for ByteArrayInputStream that does not synchronize every * byte read. * <p>This class extends {@link InputStream} and its <code>read()</code> * methods allow it to be used as a standard input stream. In addition, it * provides <code>readFast()</code> methods that are not declared to throw * <code>IOException</code>. <code>IOException</code> is never thrown by this * class.</p> * @author Mark Hayes */ public class FastInputStream extends InputStream { protected int len; protected int off; protected int mark; protected byte[] buf; /** * Creates an input stream. * @param buffer the data to read. */ public FastInputStream( byte[] buffer){ buf=buffer; len=buffer.length; } /** * Creates an input stream. * @param buffer the data to read. * @param offset the byte offset at which to begin reading. * @param length the number of bytes to read. */ public FastInputStream( byte[] buffer, int offset, int length){ buf=buffer; off=offset; len=length; } public int available(){ return len - off; } public boolean markSupported(){ return true; } public void mark( int pos){ mark=pos; } public void reset(){ off=mark; } public long skip( long count){ int myCount=(int)count; if (myCount + off > len) { myCount=len - off; } off+=myCount; return myCount; } public int read() throws IOException { return readFast(); } public int read( byte[] toBuf) throws IOException { return readFast(toBuf,0,toBuf.length); } public int read( byte[] toBuf, int offset, int length) throws IOException { return readFast(toBuf,offset,length); } /** * Equivalent to <code>read()<code> but does not throw * <code>IOException</code>. * @see #read() */ public final int readFast(){ return (off < len) ? (buf[off++] & 0xff) : (-1); } /** * Equivalent to <code>read(byte[])<code> but does not throw * <code>IOException</code>. * @see #read(byte[]) */ public final int readFast( byte[] toBuf){ return readFast(toBuf,0,toBuf.length); } /** * Equivalent to <code>read(byte[],int,int)<code> but does not throw * <code>IOException</code>. * @see #read(byte[],int,int) */ public final int readFast( byte[] toBuf, int offset, int length){ int avail=len - off; if (avail <= 0) { return -1; } if (length > avail) { length=avail; } System.arraycopy(buf,off,toBuf,offset,length); off+=length; return length; } /** * Returns the underlying data being read. * @return the underlying data. */ public final byte[] getBufferBytes(){ return buf; } /** * Returns the offset at which data is being read from the buffer. * @return the offset at which data is being read. */ public final int getBufferOffset(){ return off; } /** * Returns the end of the buffer being read. * @return the end of the buffer. */ public final int getBufferLength(){ return len; } }