
XZ for Java release notes
=========================

1.7 (2017-12-29)

    * Fix LZMA2InputStream.available() which could return a too high
      value in case of uncompressed LZMA2 chunks. This incorrect
      value was visible via other available() methods too, for example,
      XZInputStream.available().

    * Add the ArrayCache API. It's a pool-like API to reuse large byte
      and int arrays between compressor and decompressor instances.
      If you are (de)compressing many tiny files in a row, taking
      advantage of this API can improve performance significantly.

1.6 (2016-11-27)

    * Fix LZMA2Options.getInputStream to work with a preset dictionary.

    * Make it possible to disable verification of integrity checks in
      XZ decompression. It should almost never be used but may be useful
      in some rare situations. This feature is available via new
      constructors in XZInputStream, SingleXZInputStream, and
      SeekableXZInputStream.

    * Add LZMAOutputStream for encoding to raw LZMA (i.e. LZMA1) streams
      and to the legacy .lzma format.

1.5 (2014-03-08)

    * Fix a wrong assertion in BCJ decoders.

    * Use a field instead of reallocating a temporary one-byte buffer
      in read() and write() implementations in several classes.

1.4 (2013-09-22)

    * Add LZMAInputStream for decoding .lzma files and raw LZMA streams.

1.3 (2013-05-12)

    * Fix a data corruption bug when flushing the LZMA2 encoder or
      when using a preset dictionary.

    * Make information about the XZ Block positions and sizes available
      in SeekableXZInputStream by adding the following public functions:
        - int getStreamCount()
        - int getBlockCount()
        - long getBlockPos(int blockNumber)
        - long getBlockSize(int blockNumber)
        - long getBlockCompPos(int blockNumber)
        - long getBlockCompSize(int blockNumber)
        - int getBlockCheckType(int blockNumber)
        - int getBlockNumber(long pos)
        - void seekToBlock(int blockNumber)

    * Minor improvements to javadoc comments were made.

1.2 (2013-01-29)

    * Use fields instead of reallocating frequently-needed temporary
      objects in the LZMA encoder.

    * Fix the contents of xz-${version}-sources.jar.

    * Add OSGi attributes to xz.jar.

1.1 (2012-07-05)

    * The depthLimit argument in the LZMA2Options constructor is
      no longer ignored.

    * LZMA2Options() can no longer throw UnsupportedOptionsException.

    * Fix bugs in the preset dictionary support in the LZMA2 encoder.

1.0 (2011-10-22)

    * The first stable release

