Class SnappyCompressorInputStream

All Implemented Interfaces:
Closeable, AutoCloseable, InputStreamStatistics

public class SnappyCompressorInputStream extends AbstractLZ77CompressorInputStream
CompressorInputStream for the raw Snappy format.

This implementation uses an internal buffer in order to handle the back-references that are at the heart of the LZ77 algorithm. The size of the buffer must be at least as big as the biggest offset used in the compressed stream. The current version of the Snappy algorithm as defined by Google works on 32k blocks and doesn't contain offsets bigger than 32k which is the default block size used by this class.

Since:
1.7
See Also:
  • Field Details

    • TAG_MASK

      private static final int TAG_MASK
      Mask used to determine the type of "tag" is being processed
      See Also:
    • DEFAULT_BLOCK_SIZE

      public static final int DEFAULT_BLOCK_SIZE
      Default block size
      See Also:
    • size

      private final int size
      The size of the uncompressed data
    • uncompressedBytesRemaining

      private int uncompressedBytesRemaining
      Number of uncompressed bytes still to be read.
    • state

      Current state of the stream
    • endReached

      private boolean endReached
  • Constructor Details

    • SnappyCompressorInputStream

      public SnappyCompressorInputStream(InputStream is) throws IOException
      Constructor using the default buffer size of 32k.
      Parameters:
      is - An InputStream to read compressed data from
      Throws:
      IOException - if reading fails
    • SnappyCompressorInputStream

      public SnappyCompressorInputStream(InputStream is, int blockSize) throws IOException
      Constructor using a configurable buffer size.
      Parameters:
      is - An InputStream to read compressed data from
      blockSize - The block size used in compression
      Throws:
      IOException - if reading fails
      IllegalArgumentException - if blockSize is not bigger than 0
  • Method Details

    • read

      public int read(byte[] b, int off, int len) throws IOException
      Overrides:
      read in class InputStream
      Throws:
      IOException
    • fill

      private void fill() throws IOException
      Try to fill the buffer with the next block of data.
      Throws:
      IOException
    • readLiteralLength

      private int readLiteralLength(int b) throws IOException
      Throws:
      IOException
    • readSize

      private long readSize() throws IOException
      The stream starts with the uncompressed length (up to a maximum of 2^32 - 1), stored as a little-endian varint. Varints consist of a series of bytes, where the lower 7 bits are data and the upper bit is set iff there are more bytes to be read. In other words, an uncompressed length of 64 would be stored as 0x40, and an uncompressed length of 2097150 (0x1FFFFE) would be stored as 0xFE 0xFF 0x7F.
      Returns:
      The size of the uncompressed data
      Throws:
      IOException - Could not read a byte
    • getSize

      public int getSize()
      Get the uncompressed size of the stream
      Overrides:
      getSize in class AbstractLZ77CompressorInputStream
      Returns:
      the uncompressed size