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

1.8 (2018-01-04)

    * Fix a binary compatibility regression: XZ for Java 1.7 binaries
      in the Maven Central require Java 9 which is too new. XZ for
      Java 1.8 binaries require Java 5. (XZ for Java 1.6 and older
      binaries require Java 1.4.)

      If you are using OpenJDK 9 or later, you will need to edit the
      "sourcever = 1.5" line in the file "build.properties" before
      running "ant". Set it to 1.6 or higher. The default value 1.5
      isn't supported by OpenJDK 9 or later.

    * Add "Automatic-Module-Name" = "org.tukaani.xz".

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

