Class FramedLZ4CompressorInputStream

java.lang.Object
java.io.InputStream
org.apache.commons.compress.compressors.CompressorInputStream
org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorInputStream
All Implemented Interfaces:
Closeable, AutoCloseable, InputStreamStatistics

public class FramedLZ4CompressorInputStream extends CompressorInputStream implements InputStreamStatistics
CompressorInputStream for the LZ4 frame format.

Based on the "spec" in the version "1.5.1 (31/03/2015)"

Since:
1.14
See Also:
  • Field Details

    • LZ4_SIGNATURE

      static final byte[] LZ4_SIGNATURE
    • SKIPPABLE_FRAME_TRAILER

      private static final byte[] SKIPPABLE_FRAME_TRAILER
    • SKIPPABLE_FRAME_PREFIX_BYTE_MASK

      private static final byte SKIPPABLE_FRAME_PREFIX_BYTE_MASK
      See Also:
    • VERSION_MASK

      static final int VERSION_MASK
      See Also:
    • SUPPORTED_VERSION

      static final int SUPPORTED_VERSION
      See Also:
    • BLOCK_INDEPENDENCE_MASK

      static final int BLOCK_INDEPENDENCE_MASK
      See Also:
    • BLOCK_CHECKSUM_MASK

      static final int BLOCK_CHECKSUM_MASK
      See Also:
    • CONTENT_SIZE_MASK

      static final int CONTENT_SIZE_MASK
      See Also:
    • CONTENT_CHECKSUM_MASK

      static final int CONTENT_CHECKSUM_MASK
      See Also:
    • BLOCK_MAX_SIZE_MASK

      static final int BLOCK_MAX_SIZE_MASK
      See Also:
    • UNCOMPRESSED_FLAG_MASK

      static final int UNCOMPRESSED_FLAG_MASK
      See Also:
    • oneByte

      private final byte[] oneByte
    • supplier

      private final ByteUtils.ByteSupplier supplier
    • inputStream

      private final CountingInputStream inputStream
    • decompressConcatenated

      private final boolean decompressConcatenated
    • expectBlockChecksum

      private boolean expectBlockChecksum
    • expectBlockDependency

      private boolean expectBlockDependency
    • expectContentSize

      private boolean expectContentSize
    • expectContentChecksum

      private boolean expectContentChecksum
    • currentBlock

      private InputStream currentBlock
    • endReached

      private boolean endReached
    • inUncompressed

      private boolean inUncompressed
    • contentHash

      private final XXHash32 contentHash
    • blockHash

      private final XXHash32 blockHash
    • blockDependencyBuffer

      private byte[] blockDependencyBuffer
  • Constructor Details

    • FramedLZ4CompressorInputStream

      public FramedLZ4CompressorInputStream(InputStream in) throws IOException
      Creates a new input stream that decompresses streams compressed using the LZ4 frame format and stops after decompressing the first frame.
      Parameters:
      in - the InputStream from which to read the compressed data
      Throws:
      IOException - if reading fails
    • FramedLZ4CompressorInputStream

      public FramedLZ4CompressorInputStream(InputStream in, boolean decompressConcatenated) throws IOException
      Creates a new input stream that decompresses streams compressed using the LZ4 frame format.
      Parameters:
      in - the InputStream from which to read the compressed data
      decompressConcatenated - if true, decompress until the end of the input; if false, stop after the first LZ4 frame and leave the input position to point to the next byte after the frame stream
      Throws:
      IOException - if reading fails
  • Method Details

    • read

      public int read() throws IOException
      Specified by:
      read in class InputStream
      Throws:
      IOException
    • 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
    • read

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

      public long getCompressedCount()
      Specified by:
      getCompressedCount in interface InputStreamStatistics
      Returns:
      the amount of raw or compressed bytes read by the stream
      Since:
      1.17
    • init

      private void init(boolean firstFrame) throws IOException
      Throws:
      IOException
    • readSignature

      private boolean readSignature(boolean firstFrame) throws IOException
      Throws:
      IOException
    • readFrameDescriptor

      private void readFrameDescriptor() throws IOException
      Throws:
      IOException
    • nextBlock

      private void nextBlock() throws IOException
      Throws:
      IOException
    • maybeFinishCurrentBlock

      private void maybeFinishCurrentBlock() throws IOException
      Throws:
      IOException
    • verifyContentChecksum

      private void verifyContentChecksum() throws IOException
      Throws:
      IOException
    • verifyChecksum

      private void verifyChecksum(XXHash32 hash, String kind) throws IOException
      Throws:
      IOException
    • readOneByte

      private int readOneByte() throws IOException
      Throws:
      IOException
    • readOnce

      private int readOnce(byte[] b, int off, int len) throws IOException
      Throws:
      IOException
    • isSkippableFrameSignature

      private static boolean isSkippableFrameSignature(byte[] b)
    • skipSkippableFrame

      private int skipSkippableFrame(byte[] b) throws IOException
      Skips over the contents of a skippable frame as well as skippable frames following it.

      It then tries to read four more bytes which are supposed to hold an LZ4 signature and returns the number of bytes read while storing the bytes in the given array.

      Throws:
      IOException
    • appendToBlockDependencyBuffer

      private void appendToBlockDependencyBuffer(byte[] b, int off, int len)
    • matches

      public static boolean matches(byte[] signature, int length)
      Checks if the signature matches what is expected for a .lz4 file.

      .lz4 files start with a four byte signature.

      Parameters:
      signature - the bytes to check
      length - the number of bytes to check
      Returns:
      true if this is a .sz stream, false otherwise