Class RewindableDataInputStreamPlus

  • All Implemented Interfaces:
    java.io.Closeable, java.io.DataInput, java.lang.AutoCloseable, DataInputPlus, RewindableDataInput

    public class RewindableDataInputStreamPlus
    extends java.io.FilterInputStream
    implements RewindableDataInput, java.io.Closeable
    Adds mark/reset functionality to another input stream by caching read bytes to a memory buffer and spilling to disk if necessary. When the stream is marked via mark() or mark(int), up to maxMemBufferSize will be cached in memory (heap). If more than maxMemBufferSize bytes are read while the stream is marked, the following bytes are cached on the spillFile for up to maxDiskBufferSize. Please note that successive calls to mark() and reset() will write sequentially to the same spillFile until maxDiskBufferSize is reached. At this point, if less than maxDiskBufferSize bytes are currently cached on the spillFile, the remaining bytes are written to the beginning of the file, treating the spillFile as a circular buffer. If more than maxMemBufferSize + maxDiskBufferSize are cached while the stream is marked, the following reset() invocation will throw a IllegalStateException.
    • Field Detail

      • memAvailable

        protected int memAvailable
      • diskTailAvailable

        protected int diskTailAvailable
      • diskHeadAvailable

        protected int diskHeadAvailable
    • Constructor Detail

      • RewindableDataInputStreamPlus

        public RewindableDataInputStreamPlus​(java.io.InputStream in,
                                             int initialMemBufferSize,
                                             int maxMemBufferSize,
                                             java.io.File spillFile,
                                             int maxDiskBufferSize)
    • Method Detail

      • reset

        public void reset​(DataPosition mark)
                   throws java.io.IOException
        Rewinds to the previously marked position via the mark() method.
        Specified by:
        reset in interface RewindableDataInput
        Parameters:
        mark - it's not possible to return to a custom position, so this parameter is ignored.
        Throws:
        java.io.IOException - if an error ocurs while resetting
      • markSupported

        public boolean markSupported()
        Overrides:
        markSupported in class java.io.FilterInputStream
      • mark

        public void mark​(int readlimit)
        Marks the current position of a stream to return to this position later via the reset() method.
        Overrides:
        mark in class java.io.FilterInputStream
        Parameters:
        readlimit - the maximum amount of bytes to cache
      • reset

        public void reset()
                   throws java.io.IOException
        Overrides:
        reset in class java.io.FilterInputStream
        Throws:
        java.io.IOException
      • available

        public int available()
                      throws java.io.IOException
        Overrides:
        available in class java.io.FilterInputStream
        Throws:
        java.io.IOException
      • read

        public int read()
                 throws java.io.IOException
        Overrides:
        read in class java.io.FilterInputStream
        Throws:
        java.io.IOException
      • read

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

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

        public long skip​(long n)
                  throws java.io.IOException
        Overrides:
        skip in class java.io.FilterInputStream
        Throws:
        java.io.IOException
      • close

        public void close()
                   throws java.io.IOException
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Overrides:
        close in class java.io.FilterInputStream
        Throws:
        java.io.IOException
      • close

        public void close​(boolean closeUnderlying)
                   throws java.io.IOException
        Throws:
        java.io.IOException
      • readFully

        public void readFully​(byte[] b)
                       throws java.io.IOException
        Specified by:
        readFully in interface java.io.DataInput
        Throws:
        java.io.IOException
      • readFully

        public void readFully​(byte[] b,
                              int off,
                              int len)
                       throws java.io.IOException
        Specified by:
        readFully in interface java.io.DataInput
        Throws:
        java.io.IOException
      • skipBytes

        public int skipBytes​(int n)
                      throws java.io.IOException
        Description copied from interface: DataInputPlus
        Always skips the requested number of bytes, unless EOF is reached
        Specified by:
        skipBytes in interface java.io.DataInput
        Specified by:
        skipBytes in interface DataInputPlus
        Parameters:
        n - number of bytes to skip
        Returns:
        number of bytes skipped
        Throws:
        java.io.IOException
      • readBoolean

        public boolean readBoolean()
                            throws java.io.IOException
        Specified by:
        readBoolean in interface java.io.DataInput
        Throws:
        java.io.IOException
      • readByte

        public byte readByte()
                      throws java.io.IOException
        Specified by:
        readByte in interface java.io.DataInput
        Throws:
        java.io.IOException
      • readUnsignedByte

        public int readUnsignedByte()
                             throws java.io.IOException
        Specified by:
        readUnsignedByte in interface java.io.DataInput
        Throws:
        java.io.IOException
      • readShort

        public short readShort()
                        throws java.io.IOException
        Specified by:
        readShort in interface java.io.DataInput
        Throws:
        java.io.IOException
      • readUnsignedShort

        public int readUnsignedShort()
                              throws java.io.IOException
        Specified by:
        readUnsignedShort in interface java.io.DataInput
        Throws:
        java.io.IOException
      • readChar

        public char readChar()
                      throws java.io.IOException
        Specified by:
        readChar in interface java.io.DataInput
        Throws:
        java.io.IOException
      • readInt

        public int readInt()
                    throws java.io.IOException
        Specified by:
        readInt in interface java.io.DataInput
        Throws:
        java.io.IOException
      • readLong

        public long readLong()
                      throws java.io.IOException
        Specified by:
        readLong in interface java.io.DataInput
        Throws:
        java.io.IOException
      • readFloat

        public float readFloat()
                        throws java.io.IOException
        Specified by:
        readFloat in interface java.io.DataInput
        Throws:
        java.io.IOException
      • readDouble

        public double readDouble()
                          throws java.io.IOException
        Specified by:
        readDouble in interface java.io.DataInput
        Throws:
        java.io.IOException
      • readLine

        public java.lang.String readLine()
                                  throws java.io.IOException
        Specified by:
        readLine in interface java.io.DataInput
        Throws:
        java.io.IOException
      • readUTF

        public java.lang.String readUTF()
                                 throws java.io.IOException
        Specified by:
        readUTF in interface java.io.DataInput
        Throws:
        java.io.IOException