org.biojava.utils.io
Class CachingInputStream

java.lang.Object
  extended byjava.io.InputStream
      extended byorg.biojava.utils.io.CachingInputStream
All Implemented Interfaces:
Seekable

public class CachingInputStream
extends java.io.InputStream
implements Seekable

A wrapper around InputStream that provides in-memory caching of the input data. This allows it to provide a seek(long) method, which lets the user use an InputStream like a RandomAccessFile (with appropriate caveats about memory footprint, security, and performance).

This class has not been tested with very long input streams. It might choke.

Author:
Rhett Sutphin (UI CBCB)

Field Summary
protected  byte[] cache
          The byte cache itself.
protected  java.io.InputStream in
          The underlying input stream whose data we're caching
protected  int ptr
          The 0-based index into cache of the _next_ byte to return.
protected  int validLen
          A count of the number of bytes in cache that contain data read from the stream.
 
Constructor Summary
CachingInputStream(java.io.InputStream in)
           
 
Method Summary
protected  void expandCache(int additionalBytes)
          Expands the cache to hold some number of additionalBytes.
 int read()
           
 int read(byte[] b, int start, int len)
           
 void seek(long pos)
          Moves the pointer in the inputstream such that the byte starting at pos are returned by the next read.
 long skip(long num)
           
 
Methods inherited from class java.io.InputStream
available, close, mark, markSupported, read, reset
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

cache

protected byte[] cache
The byte cache itself.


ptr

protected int ptr
The 0-based index into cache of the _next_ byte to return. If ptr == validLen, data must be read from the stream into the cache.


validLen

protected int validLen
A count of the number of bytes in cache that contain data read from the stream.


in

protected java.io.InputStream in
The underlying input stream whose data we're caching

Constructor Detail

CachingInputStream

public CachingInputStream(java.io.InputStream in)
Method Detail

seek

public void seek(long pos)
          throws java.io.IOException
Description copied from interface: Seekable
Moves the pointer in the inputstream such that the byte starting at pos are returned by the next read.

Specified by:
seek in interface Seekable
Parameters:
pos - the position to which to seek
Throws:
java.io.IOException - when there's an I/O problem

read

public int read()
         throws java.io.IOException
Throws:
java.io.IOException

read

public int read(byte[] b,
                int start,
                int len)
         throws java.io.IOException
Throws:
java.io.IOException

skip

public long skip(long num)
          throws java.io.IOException
Throws:
java.io.IOException

expandCache

protected void expandCache(int additionalBytes)
Expands the cache to hold some number of additionalBytes. Expansion is done multiplicatively for efficiency. Immediately after calling this method, you must fill the additional bytes from the stream because this method also updates validLen.