Class CachingInputStream

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, 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

      Fields 
      Modifier and Type Field Description
      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

      Constructors 
      Constructor Description
      CachingInputStream​(java.io.InputStream in)  
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      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, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, transferTo
      • 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
        Specified by:
        read in class java.io.InputStream
        Throws:
        java.io.IOException
      • read

        public int read​(byte[] b,
                        int start,
                        int len)
                 throws java.io.IOException
        Overrides:
        read in class java.io.InputStream
        Throws:
        java.io.IOException
      • skip

        public long skip​(long num)
                  throws java.io.IOException
        Overrides:
        skip in class java.io.InputStream
        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.