## org.biojava.utils.io
Class CachingInputStream

    java.lang.Object
      java.io.InputStream
          org.biojava.utils.io.CachingInputStream

All Implemented Interfaces:
  Closeable, Seekable

    public class CachingInputStream

extends 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 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(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 InputStream in

  The underlying input stream whose data we're caching

Constructor Detail

### CachingInputStream

    public CachingInputStream(InputStream in)

Method Detail

### seek

    public void seek(long pos)
              throws 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:
    `IOException` - when there's an I/O problem

### read

    public int read()
             throws IOException

  Specified by:
    `read` in class `InputStream`
  Throws:
    `IOException`

### read

    public int read(byte[] b,
                    int start,
                    int len)
             throws IOException

  Overrides:
    `read` in class `InputStream`
  Throws:
    `IOException`

### skip

    public long skip(long num)
              throws IOException

  Overrides:
    `skip` in class `InputStream`
  Throws:
    `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.