Class AbstractLZ77CompressorInputStream

java.lang.Object
java.io.InputStream
org.apache.commons.compress.compressors.CompressorInputStream
org.apache.commons.compress.compressors.lz77support.AbstractLZ77CompressorInputStream
All Implemented Interfaces:
Closeable, AutoCloseable, InputStreamStatistics
Direct Known Subclasses:
BlockLZ4CompressorInputStream, SnappyCompressorInputStream

Encapsulates code common to LZ77 decompressors.

Assumes the stream consists of blocks of literal data and back-references (called copies) in any order. Of course the first block must be a literal block for the scheme to work - unless the prefill method has been used to provide initial data that is never returned by read but only used for back-references.

Subclasses must override the three-arg read method as the no-arg version delegates to it and the default implementation delegates to the no-arg version, leading to infinite mutual recursion and a StackOverflowError otherwise.

The contract for subclasses' read implementation is:

readOneByte() and readLiteral(byte[], int, int) update the counter for bytes read.

Since:
1.14
  • Field Details

  • Constructor Details

    • AbstractLZ77CompressorInputStream

      public AbstractLZ77CompressorInputStream(InputStream is, int windowSize)
      Creates a new LZ77 input stream.
      Parameters:
      is - An InputStream to read compressed data from
      windowSize - Size of the window kept for back-references, must be bigger than the biggest offset expected.
      Throws:
      IllegalArgumentException - if windowSize is not bigger than 0
  • Method Details

    • available

      public int available()
      Overrides:
      available in class InputStream
    • close

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Overrides:
      close in class InputStream
      Throws:
      IOException
    • getCompressedCount

      public long getCompressedCount()
      Description copied from interface: InputStreamStatistics
      Gets the amount of raw or compressed bytes read by the stream.
      Specified by:
      getCompressedCount in interface InputStreamStatistics
      Returns:
      the amount of raw or compressed bytes read by the stream.
      Since:
      1.17
    • getSize

      public int getSize()
      Gets the uncompressed size of the stream
      Returns:
      the uncompressed size
    • hasMoreDataInBlock

      protected final boolean hasMoreDataInBlock()
      Is there still data remaining inside the current block?
      Returns:
      true if there is still data remaining inside the current block.
    • prefill

      public void prefill(byte[] data)
      Adds some initial data to fill the window with.

      This is used if the stream has been cut into blocks and back-references of one block may refer to data of the previous block(s). One such example is the LZ4 frame format using block dependency.

      Parameters:
      data - the data to fill the window with.
      Throws:
      IllegalStateException - if the stream has already started to read data
    • read

      public int read() throws IOException
      Specified by:
      read in class InputStream
      Throws:
      IOException
    • readBackReference

      protected final int readBackReference(byte[] b, int off, int len)
      Reads data from the current back-reference.
      Parameters:
      b - buffer to write data to
      off - offset to start writing to
      len - maximum amount of data to read
      Returns:
      number of bytes read, may be 0. Will never return -1 as EOF-detection is the responsibility of the subclass
      Throws:
      NullPointerException - if b is null
      IndexOutOfBoundsException - if off is negative, len is negative, or len is greater than b.length - off
    • readLiteral

      protected final int readLiteral(byte[] b, int off, int len) throws IOException
      Reads data from the current literal block.
      Parameters:
      b - buffer to write data to
      off - offset to start writing to
      len - maximum amount of data to read
      Returns:
      number of bytes read, may be 0. Will never return -1 as EOF-detection is the responsibility of the subclass
      Throws:
      IOException - if the underlying stream throws or signals an EOF before the amount of data promised for the block have been read
      NullPointerException - if b is null
      IndexOutOfBoundsException - if off is negative, len is negative, or len is greater than b.length - off
    • readOneByte

      protected final int readOneByte() throws IOException
      Reads a single byte from the real input stream and ensures the data is accounted for.
      Returns:
      the byte read as value between 0 and 255 or -1 if EOF has been reached.
      Throws:
      IOException - if the underlying stream throws
    • startBackReference

      protected final void startBackReference(int offset, long length)
      Used by subclasses to signal the next block contains a back-reference with the given coordinates.
      Parameters:
      offset - the offset of the back-reference
      length - the length of the back-reference
      Throws:
      IllegalArgumentException - if offset not bigger than 0 or bigger than the number of bytes available for back-references or if length is negative
    • startLiteral

      protected final void startLiteral(long length)
      Used by subclasses to signal the next block contains the given amount of literal data.
      Parameters:
      length - the length of the block
      Throws:
      IllegalArgumentException - if length is negative