org.apache.cassandra.io.util

## Class RewindableDataInputStreamPlus

- java.lang.Object
- - java.io.InputStream
  - - java.io.FilterInputStream
    - - org.apache.cassandra.io.util.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`.

### Nested Class Summary

Nested Classes
`protected static class` `RewindableDataInputStreamPlus.RewindableDataInputPlusMark`

### Nested classes/interfaces inherited from interface org.apache.cassandra.io.util.DataInputPlus

`DataInputPlus.DataInputStreamPlus`

### Field Summary

Fields
`protected int` `diskHeadAvailable`
`protected int` `diskTailAvailable`
`protected int` `memAvailable`

### Fields inherited from class java.io.FilterInputStream

`in`

### Constructor Summary

Constructors
Constructor and Description
`RewindableDataInputStreamPlus(java.io.InputStream in, int initialMemBufferSize, int maxMemBufferSize, java.io.File spillFile, int maxDiskBufferSize)`

### Method Summary

All Methods Instance Methods Concrete Methods
`int` `available()`
`long` `bytesPastMark(DataPosition mark)`
`void` `close()`
`void` `close(boolean closeUnderlying)`
`DataPosition` `mark()` Marks the current position of a stream to return to this position later via the `reset(DataPosition)` method.
`void` `mark(int readlimit)` Marks the current position of a stream to return to this position later via the `reset()` method.
`boolean` `markSupported()`
`int` `read()`
`int` `read(byte[] b)`
`int` `read(byte[] b, int off, int len)`
`boolean` `readBoolean()`
`byte` `readByte()`
`char` `readChar()`
`double` `readDouble()`
`float` `readFloat()`
`void` `readFully(byte[] b)`
`void` `readFully(byte[] b, int off, int len)`
`int` `readInt()`
`java.lang.String` `readLine()`
`long` `readLong()`
`short` `readShort()`
`int` `readUnsignedByte()`
`int` `readUnsignedShort()`
`java.lang.String` `readUTF()`
`void` `reset()`
`void` `reset(DataPosition mark)` Rewinds to the previously marked position via the `mark()` method.
`long` `skip(long n)`
`int` `skipBytes(int n)` Always skips the requested number of bytes, unless EOF is reached

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Methods inherited from interface org.apache.cassandra.io.util.DataInputPlus

`readUnsignedVInt, readVInt, skipBytesFully`

### 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

#### mark

    public DataPosition mark()

Marks the current position of a stream to return to this position later via the `reset(DataPosition)` method.

Specified by:
  `mark` in interface `RewindableDataInput`
Returns:
  An empty @link{DataPosition} object

#### 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

#### bytesPastMark

    public long bytesPastMark(DataPosition mark)

Specified by:
  `bytesPastMark` in interface `RewindableDataInput`

#### 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.io.Closeable`
Specified by:
  `close` in interface `java.lang.AutoCloseable`
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`