Class UnsafeChunkDecoder

java.lang.Object
com.ning.compress.lzf.ChunkDecoder
com.ning.compress.lzf.impl.UnsafeChunkDecoder

public class UnsafeChunkDecoder extends ChunkDecoder
Highly optimized ChunkDecoder implementation that uses Sun JDK's Unsafe class (which may be included by other JDK's as well; IBM's apparently does).

Credits for the idea go to Dain Sundstrom, who kindly suggested this use, and is all-around great source for optimization tips and tricks. Big thanks also to LZ4-java developers, whose stellar performance made me go back and see what more I can do to optimize this code!

  • Field Details

    • unsafe

      private static final sun.misc.Unsafe unsafe
    • BYTE_ARRAY_OFFSET

      private static final long BYTE_ARRAY_OFFSET
  • Constructor Details

    • UnsafeChunkDecoder

      public UnsafeChunkDecoder()
  • Method Details

    • decodeChunk

      public final int decodeChunk(InputStream is, byte[] inputBuffer, byte[] outputBuffer) throws IOException
      Description copied from class: ChunkDecoder
      Main decode from a stream. Decompressed bytes are placed in the outputBuffer, inputBuffer is a "scratch-area".
      Specified by:
      decodeChunk in class ChunkDecoder
      Parameters:
      is - An input stream of LZF compressed bytes
      inputBuffer - A byte array used as a scratch area.
      outputBuffer - A byte array in which the result is returned
      Returns:
      The number of bytes placed in the outputBuffer.
      Throws:
      IOException
    • decodeChunk

      public final void decodeChunk(byte[] in, int inPos, byte[] out, int outPos, int outEnd) throws LZFException
      Description copied from class: ChunkDecoder
      Main decode method for individual chunks.
      Specified by:
      decodeChunk in class ChunkDecoder
      Throws:
      LZFException
    • skipOrDecodeChunk

      public int skipOrDecodeChunk(InputStream is, byte[] inputBuffer, byte[] outputBuffer, long maxToSkip) throws IOException
      Specified by:
      skipOrDecodeChunk in class ChunkDecoder
      Returns:
      If positive number, number of bytes skipped; if -1, end-of-stream was reached; otherwise, amount of content decoded (using formula of returnValue = -(decodedAmount + 2))
      Throws:
      IOException
    • copyOverlappingShort

      private final int copyOverlappingShort(byte[] out, int outPos, int offset, int len)
    • copyOverlappingLong

      private static final int copyOverlappingLong(byte[] out, int outPos, int offset, int len)
    • copyUpTo32

      private static final void copyUpTo32(byte[] buffer, int inputIndex, int outputIndex, int lengthMinusOne)
    • copyUpTo32

      private static final void copyUpTo32(byte[] in, int inputIndex, byte[] out, int outputIndex, int lengthMinusOne)
    • copyLong

      private static final void copyLong(byte[] buffer, int inputIndex, int outputIndex, int length, int outputEnd8)
    • copyLongTail

      private static final void copyLongTail(byte[] buffer, int inputIndex, int outputIndex, int length)