              Apache Commons Compress RELEASE NOTES

Apache Commons Compress software defines an API for working with
compression and archive formats.  These include: bzip2, gzip, pack200,
lzma, xz, Snappy, traditional Unix Compress, DEFLATE, DEFLATE64, LZ4,
Brotli, Zstandard and ar, cpio, jar, tar, zip, dump, 7z, arj.

Release 1.19
------------

ZipArchiveInputStream and ZipFile will no longer throw an exception if
an extra field generally understood by Commons Compress is malformed
but rather turn them into UnrecognizedExtraField instances.  You can
influence the way extra fields are parsed in more detail by using the
new getExtraFields(ExtraFieldParsingBehavior) method of
ZipArchiveEntry now.

Some of the ZIP extra fields related to strong encryption will now
throw ZipExceptions rather than ArrayIndexOutOfBoundsExceptions in
certain cases when used directly. There is no practical difference
when they are read via ZipArchiveInputStream or ZipFile.

New features:
o It is now possible to skip parsing of local file headers when
  using ZipFile which may speed up reading the archive at the
  cost of potentially missing important information. See the
  javadocs of the ZipFile class for details.
  Issue: COMPRESS-466. 
o TarArchiveInputStream has a new constructor-arg lenient that
  can be used to accept certain broken archives.
  Issue: COMPRESS-469. 
o ArjArchiveEntry and SevenZArchiveEntry now implement hashCode
  and equals.
  Issue: COMPRESS-475. 
o Added a MultiReadOnlySeekableByteChannel class
  that can be used to concatenate the parts of a multi volume 7z
  archive so that SevenZFile can read them.
  Issue: COMPRESS-231.
  Thanks to Tim Underwood. 

Fixed Bugs:
o ZipArchiveInputStream could forget the compression level has
  changed under certain circumstances. 
o Fixed another potential resource leak in
  ParallelScatterZipCreator#writeTo.
  Issue: COMPRESS-470. 
o ArArchiveInputStream could think it had hit EOF prematurely.
  Github Pull Request #74.
  Thanks to Alex Bertram. 
o Throw IOException rather than RuntimeExceptions for certain
  malformed LZ4 or Snappy inputs.
  Issue: COMPRESS-490. 
o ZipArchiveInputStream failed to read stored entries with a
  data descriptor if the data descriptor didn't use the
  signature invented by InfoZIP.
  Issue: COMPRESS-482. 

Changes:
o SevenZFile now provides a way to cap memory consumption for
  LZMA(2) compressed content.
  Github Pull Request #76.
  Issue: COMPRESS-481.
  Thanks to Robin Schimpf. 
o The ARJ package has been updated to contain constants for more
  recent specifications.
  Issue: COMPRESS-464.
  Thanks to Rostislav Krasny. 
o Update optional library zstd-jni from 1.3.3-3 to 1.4.0-1.
  Issue: COMPRESS-484. 
o ParallelScatterZipCreator now writes the entries to the
  gathered output in the same order they have been added.
  Github Pull Requests #78 and #79.
  Issue: COMPRESS-485.
  Thanks to Hervé Boutemy, Tibor Digana. 
o The Expander and Archive example classes can leak resources
  they have wrapped around passed in streams or channels. The
  methods consuming streams and channels have been adapted to
  give the calling code a chance to deal with those wrapper
  resources.
  Issue: COMPRESS-486. 
o ZipArchiveInputStream and ZipFile no longer assume Commons
  Compress would understand extra fields better than the writer
  of the archive and silently turn extra fields that Commons
  Compress should understand into UnrecognizedExtraFields if
  parsing said fields fails.
  It is now possible to take more control over the extra field
  parsing process with a new overload of
  ZipArchiveEntry#getExtraFields.
  Issue: COMPRESS-479. 
o ZipArchiveInputStream will now throw an exception if reading a
  stored entry with a data descriptor and the data descriptor
  doesn't match what it has actually read.

  The most common case for a situation like this is a stored ZIP
  archive inside of the archive ZipArchiveInputStream currently
  reads. In such a case ZipArchiveInputStream would happily
  extract the contained archive and stop once the central
  directory of the inner archive has been hit. This is a case
  where ZipArchiveInputStream simply can not be used and only
  ZipFile is able to read the archive.

  The only other explanation is a broken archive. So the
  exception prevents users from thinking they had successfully
  read the contents of the archive.
  Issue: COMPRESS-483. 
o The 7zip tools provide a default name for archive entries
  without name; SevenZFile returns a null name for such
  entries. A new method getDefaultName has been added to derive
  the same name the 7zip tools would use and an option has been
  added that sets SevenZArchiveEntry's name to the default name
  if it is not contained inside the archive.
  Issue: COMPRESS-478.

Release 1.18
------------

New features:
o It is now possible to specify the arguments of zstd-jni's
  ZstdOutputStream constructors via Commons Compress as well.
  Issue: COMPRESS-460.
  Thanks to Carmi Grushko.

Fixed Bugs:
o The example Expander class has been vulnerable to a path
  traversal in the edge case that happens when the target
  directory has a sibling directory and the name of the target
  directory is a prefix of the sibling directory's name.
  Thanks to Didier Loiseau.
o Changed the OSGi Import-Package to also optionally import
  javax.crypto so encrypted archives can be read.
  Issue: COMPRESS-456.
o Changed various implementations of the close method to better
  ensure all held resources get closed even if exceptions are
  thrown during the closing the stream.
  Issue: COMPRESS-457.
o ZipArchiveInputStream can now detect the APK Signing Block
  used in signed Android APK files and treats it as an "end of
  archive" marker.
  Issue: COMPRESS-455.
o The cpio streams didn't handle archives using a multi-byte
  encoding properly.
  Issue: COMPRESS-459.
  Thanks to Jens Reimann.
o ZipArchiveInputStream#read would silently return -1 on a
  corrupted stored entry and even return > 0 after hitting the
  end of the archive.
  Issue: COMPRESS-463.
o ArArchiveInputStream#read would allow to read from the stream
  without opening an entry at all.
  Issue: COMPRESS-462.

Release 1.17
------------

New features:
o Added a unit test that is supposed to fail if we break the
  OSGi manifest entries again.
  Issue: COMPRESS-443.
o Add a new SkipShieldingInputStream class that can be used with
  streams that throw an IOException when skip is invoked.
  Issue: COMPRESS-449.
o New constructors have been added to SevenZFile that accept
  char[]s rather than byte[]s in order to avoid a common error
  of using the wrong encoding when creating the byte[].  This
  change may break source compatibility for client code that
  uses one of the constructors expecting a password and passes
  in null as password. We recommend to change the code to use a
  constructor without password argument.
  Issue: COMPRESS-452.

Fixed Bugs:
o Removed the objenesis dependency from the pom as it is not
  needed at all.
o Fixed resource leak in ParallelScatterZipCreator#writeTo.
  Issue: COMPRESS-446.
o Certain errors when parsing ZIP extra fields in corrupt
  archives are now turned into ZipException, they used to
  manifest as ArrayIndexOutOfBoundsException before.
  Issue: COMPRESS-447.
o IOUtils.copy now verifies the buffer size is bigger than 0.
  Issue: COMPRESS-451.
o ZipArchiveInputStream failed to read some files with stored
  entries using a data descriptor.
  Issue: COMPRESS-454.

Changes:
o Fixed some code examples.
  Github Pull Request #63.
  Thanks to Marchenko Sergey.
o The streams returned by ZipFile and most other decompressing
  streams now provide information about the number of compressed
  and uncompressed bytes read so far. This may be used to detect
  a ZipBomb if the compression ratio exceeds a certain
  threshold, for example.
  For SevenZFile a new method returns the statistics for the
  current entry.
  Issue: COMPRESS-445.
  Thanks to Andreas Beeker.
o Added a workaround for a bug in AdoptOpenJDK for S/390 to
  BZip2CompressorInputStream.
  Issue: COMPRESS-453.

Release 1.16.1
--------------

Fixed Bug:
o Fixed the OSGi manifest entry for imports that has been broken
  in 1.16.
  Issue: COMPRESS-442.

Release 1.16
------------

New features:
o Add read-only support for Zstandard compression based on the
  Zstd-jni project.
  Issue: COMPRESS-423. Thanks to Andre F de Miranda.
o Added auto-detection for Zstandard compressed streams.
  Issue: COMPRESS-425.
o Added write-support for Zstandard compression.
  Issue: COMPRESS-426.
o Added read-only DEFLATE64 support to ZIP archives and as
  stand-alone CompressorInputStream.
  Issue: COMPRESS-380. Thanks to Christian Marquez Grabia.
o Added read-only DEFLATE64 support to 7z archives.
  Issue: COMPRESS-437.

Fixed Bugs:
o Synchronized iteration over a synchronizedList in
  ParallelScatterZipCreator.
  Issue: COMPRESS-430. Thanks to Bruno P. Kinoshita.
o ZipFile could get stuck in an infinite loop when parsing ZIP
  archives with certain strong encryption headers.
  Issue: COMPRESS-432.
o Added improved checks to detect corrupted bzip2 streams and
  throw the expected IOException rather than obscure
  RuntimeExceptions.
  Issue: COMPRESS-424.

Changes:
o Replaces instanceof checks with a type marker in LZ77 support code.
  Issue: COMPRESS-435. Thanks to BELUGA BEHR.
o Updated XZ for Java dependency to 1.8 in order to pick up bug fix
  to LZMA2InputStream's available method.
o ZipArchiveEntry now exposes how the name or comment have been
  determined when the entry was read.
  Issue: COMPRESS-429. Thanks to Damiano Albani.
o ZipFile.getInputStream will now always buffer the stream
  internally in order to improve read performance.
  Issue: COMPRESS-438.
o Speed improvement for DEFLATE64 decompression.
  Issue: COMPRESS-440. Thanks to Dawid Weiss.
o Added a few extra sanity checks for the rarer compression
  methods used in ZIP archives.
  Issue: COMPRESS-436.
o Simplified the special handling for the dummy byte required by
  zlib when using java.util.zip.Inflater.
  Issue: COMPRESS-441.
o Various code cleanups.
  Github Pull Request #61. Thanks to Shahab Kondri.
o TarArchiveEntry's preserveLeadingSlashes constructor argument
  has been renamed and can now also be used to preserve the
  drive letter on Windows.

Release 1.15
------------

New features:
o Added magic MANIFEST entry Automatic-Module-Name so the module
  name will be org.apache.commons.compress when the jar is used
  as an automatic module in Java9.
  Issue: COMPRESS-397.
o Added a new utility class FixedLengthBlockOutputStream that
  can be used to ensure writing always happens in blocks of a
  given size.
  Issue: COMPRESS-405. Thanks to Simon Spero.
o It is now possible to specify/read custom PAX headers when
  writing/reading tar archives.
  Issue: COMPRESS-400. Thanks to Simon Spero.

Fixed Bugs:
o Make sure "version needed to extract" in local file header and
  central directory of a ZIP archive agree with each other.
  Also ensure the version is set to 2.0 if DEFLATE is used.
  Issue: COMPRESS-394.
o Don't use a data descriptor in ZIP archives when copying a raw
  entry that already knows its size and CRC information.
  Issue: COMPRESS-395.
o Travis build redundantly repeats compilation and tests redundantly
  GitHub Pull Request #43. Thanks to Simon Spero.
  Issue: COMPRESS-413
o The MANIFEST of 1.14 lacks an OSGi Import-Package for XZ for
  Java.
  Issue: COMPRESS-396.
o BUILDING.md now passes the RAT check.
  Issue: COMPRESS-406. Thanks to Simon Spero.
o Made sure ChecksumCalculatingInputStream receives valid
  checksum and input stream instances via the constructor.
  Issue: COMPRESS-412. Thanks to Michael Hausegger.
o TarArchiveOutputStream now verifies the block and record sizes
  specified at construction time are compatible with the tar
  specification. In particular 512 is the only record size
  accepted and the block size must be a multiple of 512.
  Issue: COMPRESS-407. Thanks to Simon Spero.
o Fixed class names of CpioArchiveEntry and
  CpioArchiveInputStream in various Javadocs.
  Issue: COMPRESS-415.
o The code of the extended timestamp zip extra field incorrectly
  assumed the time was stored as unsigned 32-bit int and thus
  created incorrect results for years after 2037.
  Issue: COMPRESS-416. Thanks to Simon Spero.
o Removed ZipEncoding code that became obsolete when we started
  to require Java 5 as baseline long ago.
  Issue: COMPRESS-410. Thanks to Simon Spero.
o The tar package will no longer try to parse the major and
  minor device numbers unless the entry represents a character
  or block special file.
  Issue: COMPRESS-417.
o When reading tar headers with name fields containing embedded
  NULs, the name will now be terminated at the first NUL byte.
  Issue: COMPRESS-421. Thanks to Roel Spilker.
o Simplified TarArchiveOutputStream by replacing the internal
  buffering with new class FixedLengthBlockOutputStream.
  Issue: COMPRESS-409.

Release 1.14
------------

New features:
o Added write support for Snappy.
  Issue: COMPRESS-246.
o Added support for LZ4 (block and frame format).
  Issue: COMPRESS-271.
o Add static detect(InputStream in) to CompressorStreamFactory
  and ArchiveStreamFactory
  Issue: COMPRESS-385.
o Added a way to limit amount of memory ZCompressorStream may
  use.
  Issue: COMPRESS-382. Thanks to Tim Allison.
o Added a way to limit amount of memory ZCompressorStream may
  use.
  Issue: COMPRESS-386. Thanks to Tim Allison.
o Added a way to limit amount of memory LZMACompressorStream and
  XZCompressorInputStream may use.
  Issue: COMPRESS-382. Thanks to Tim Allison.
o Add Brotli decoder based on the Google Brotli library.
  Issue: COMPRESS-392. Thanks to Philippe Mouawad.
o ZipEntry now exposes its data offset.
  Issue: COMPRESS-390. Thanks to Zbynek Vyskovsky.
o Using ZipArchiveEntry's setAlignment it is now possible to
  ensure the data offset of an entry starts at a file position
  that at word or page boundaries.
  A new extra field has been added for this purpose.
  Issue: COMPRESS-391. Thanks to Zbynek Vyskovsky.

Fixed Bugs:
o SnappyCompressorInputStream slides the window too early
  leading to ArrayIndexOutOfBoundsExceptions for some streams.
  Issue: COMPRESS-378.
o ZipArchiveEntry#isUnixSymlink now only returns true if the
  corresponding link flag is the only file-type flag set.
  Issue: COMPRESS-379. Thanks to Guillaume Boué.
o Fixed an integer overflow in CPIO's CRC calculation.
  Pull Request #17. Thanks to Daniel Collin.
o Make unit tests work on Windows paths with spaces in their names.
  Issue: COMPRESS-387.
o Internal location pointer in ZipFile could get incremented
  even if nothing had been read.
  Issue: COMPRESS-389.
o LZMACompressorOutputStream#flush would throw an exception
  rather than be the NOP it promised to be.
  Issue: COMPRESS-393.

Changes:
o The blocksize for FramedSnappyCompressorInputStream can now be
  configured as some IWA files seem to be using blocks larger
  than the default 32k.
  Issue: COMPRESS-358.
o BZip2CompressorInputstream now uses BitInputStream internally.
  Pull Request #13. Thanks to Thomas Meyer.
o Improved performance for concurrent reads from ZipFile when
  reading from a file.
  Issue: COMPRESS-388. Thanks to Zbynek Vyskovsky.

Release 1.13
------------

Commons Compress 1.13 is the first version to require Java 7 at
runtime.

Changes in this version include:

New features:
o SevenZFile, SevenZOutputFile, ZipFile and
  ZipArchiveOutputStream can now work on non-file resources if
  they can be accessed via SeekableByteChannel.
  Issue: COMPRESS-327.
o Allow compressor extensions through a standard JRE ServiceLoader.
  Issue: COMPRESS-368.
o Allow archive extensions through a standard JRE ServiceLoader.
  Issue: COMPRESS-369.
o Add write support for the legacy LZMA format, this requires XZ
  for Java 1.6.
  Issue: COMPRESS-373.
o Add write support for the legacy LZMA stream to 7z, this
  requires XZ for Java 1.6.
  Issue: COMPRESS-374.
o Allow the clients of ParallelScatterZipCreator to provide
  ZipArchiveEntryRequestSupplier.
  Issue: COMPRESS-375. Thanks to Plamen Totev.
o Add a version-independent link to the API docs of the latest
  release.
  Issue: COMPRESS-372.

Fixed Bugs:
o BitInputStream could return bad results when overflowing
  internally - if two consecutive reads tried to read more than
  64 bits.
  Issue: COMPRESS-363.
o ZipArchiveInputStream.closeEntry does not properly advance to
  next entry if there are junk bytes at end of data section.
  Issue: COMPRESS-364. Thanks to Mike Mole.
o ZipArchiveInputStream now throws an Exception if it encounters
  a broken ZIP archive rather than signaling end-of-archive.
  Issue: COMPRESS-367. Thanks to Mike Mole.
o ScatterZipOutputStream didn't close the StreamCompressor
  causing a potential resource leak.
  Issue: COMPRESS-377.

Changes:
o Update Java requirement from 6 to 7.
  Issue: COMPRESS-360.
o Clarified which TarArchiveEntry methods are useless for
  entries read from an archive.
  Issue: COMPRESS-366.

Release 1.12
------------

Commons Compress 1.12 is the first version to require Java 6 at
runtime.

Release 1.12 changes the behavior of BZip2CompressorOutputStream's
finalize method so that it no longer invokes finish. This is going to
break code that relied on the finalizer to clean up an unfinished
stream. The code will need to be changed to call finish or close
itself. Note that a finalizer is not guaranteed to run, so the feature
was not 100% effective in any case.

New features:

o FramedSnappyCompressorInputStream now supports the dialect of
  Snappy used by the IWA files contained within the zip archives
  used in Apple's iWork 13 files.
  Issue: COMPRESS-352.

Fixed Bugs:

o SevenZFile.read() throws an IllegalStateException for empty entries.
  Issue: COMPRESS-348.
o TarArchiveInputStream failed to parse PAX headers that included
  blank lines.
  Issue: COMPRESS-355. Thanks to Jeremy Gustie.
o TarArchiveInputStream failed to parse PAX headers whose tar entry
  name ended with a slash.
  Issue: COMPRESS-356. Thanks to Jeremy Gustie.

Changes:
o Update requirement from Java 5 to 6.
  Issue: COMPRESS-349.
o TarArchiveEntry wastefully allocates empty arrays.
  Issue: COMPRESS-350.
o Javadoc for BZip2CompressorInputStream(InputStream, boolean) should
  refer to IOEx, not NPE.
  Issue: COMPRESS-353.
o PureJavaCrc32C in the snappy package is now final so it is now safe
  to call a virtual method inside the constructor.
  Issue: COMPRESS-354.

o ZipArchiveInputStream and CpioArchiveInputStream could throw
  exceptions who's messages contained potentially corrupt entry names
  read from a broken archive. They will now sanitize the names by
  replacing unprintable characters and restricting the length to 255
  characters.
  Issue: COMPRESS-351.
o BZip2CompressorOutputStream no longer tries to finish the output
  stream in finalize. This is a breaking change for code that relied
  on the finalizer.
  Issue: COMPRESS-357.


Release 1.11
------------

New features:
o TarArchiveInputStream now supports reading global PAX headers.
  Issue: COMPRESS-347.
o The PAX headers for sparse entries written by star are now
  applied.
  Issue: COMPRESS-346.
o GNU sparse files using one of the PAX formats are now
  detected, but cannot be extracted.
  Issue: COMPRESS-345.
o New method SevenZFile.getEntries can be used to list the
  contents of a 7z archive.
  Issue: COMPRESS-341.
o When using Zip64Mode.Always also use ZIP64 extensions inside
  the central directory.
  GitHub Pull Request #10 Thanks to Matt Hovey.
o ZipFile.getRawInputStream() is now part of the public API
  Issue: COMPRESS-323.
o Allow byte-for-byte replication of Zip entries.
  GitHub Pull Request #6. Thanks to Jason van Zyl.
o TarArchiveEntry's preserveLeadingSlashes is now a property and used
  on later calls to setName, too.
  This behavior is a breaking change.
  Issue: COMPRESS-328.
o Added read-only support for bzip2 compression used inside of
  ZIP archives.
  GitHub Pull Request #4. Thanks to Sören Glimm.

Fixed Bugs:
o ArArchiveInputStream can now read GNU extended names that are
  terminated with a NUL byte rather than a linefeed.
  Issue: COMPRESS-344.
o Native Memory Leak in Sevenz-DeflateDecoder.
  Issue: COMPRESS-343. Thanks to Rene Preissel.
o SevenZFile will now only try to drain an entry's content when
  moving on to the next entry if data is read from the next
  entry. This should improve performance for applications that
  try to skip over entries.
  Issue: COMPRESS-340. Thanks to Dawid Weiss.
o file names of tar archives using the xstar format are now
  parsed properly.
  Issue: COMPRESS-336.
o checksums of tars that pad the checksum field to the left are
  now calculated properly.
  Issue: COMPRESS-335.
o ArArchiveInputStream failed to read past the first entry when
  BSD long names have been used.
  Issue: COMPRESS-334. Thanks to Jeremy Gustie.
o Added buffering for random access which speeds up 7Z support.
  Issue: COMPRESS-333. Thanks to Dawid Weiss.
o The checksum validation of TararchiveEntry is now as strict as
  the validation of GNU tar, which eliminates a few cases of
  false positives of ArchiveStreamFactory.
  This behavior is a breaking change since the check has become
  more strict but any archive that fails the checksum test now
  would also fail it when extracted with other tools and must be
  considered an invalid archive.
  Issue: COMPRESS-331.
o SnappyCompressorInputStream and
  FramedSnappyCompressorInputStream returned 0 at the end of the
  stream under certain circumstances.
  Issue: COMPRESS-332.
o Adjusted unit test to updates in Java8 and later that change
  the logic of ZipEntry#getTime.
  Issue: COMPRESS-326.
o TarArchiveOutputStream will now recognize GNU long name and
  link entries even if the special entry has a different name
  than GNU tar uses itself.  This seems to be the case for
  archives created by star.
  Issue: COMPRESS-324.
o ArrayIndexOutOfBoundsException when InfoZIP type 7875 extra
  fields are read from the central directory.
  Issue: COMPRESS-321.

Release 1.10
------------

Release 1.10 moves the former
org.apache.commons.compress.compressors.z._internal_ package which
breaks backwards compatibility for code which used the old package.

This also changes the superclass of ZCompressorInputStream which makes
this class binary incompatible with the one of Compress 1.9.  Code
that extends ZCompressorInputStream will need to be recompiled in
order to work with Compress 1.10.

New features:
o CompressorStreamFactory can now auto-detect DEFLATE streams
  with ZLIB header.
  Issue: COMPRESS-316. Thanks to Nick Burch.
o CompressorStreamFactory can now auto-detect LZMA streams.
  Issue: COMPRESS-313.
o Added support for parallel compression. This low-level API allows
  a client to build a zip/jar file by using the class
  org.apache.commons.compress.archivers.zip.ParallelScatterZipCreator.

  Zip documentation updated with further notes about parallel features.

  Please note that some aspects of jar creation need to be
  handled by client code and is not part of commons-compress for this
  release.
  Issue: COMPRESS-296. Thanks to Kristian Rosenvold.
o Cut overall object instantiation in half by changing file
  header generation algorithm, for a 10-15 percent performance
  improvement.

  Also extracted two private methods createLocalFileHeader
  and createCentralFileHeader in ZipArchiveOutputStream.
  These may have some interesting additional usages in the
  near future. Thanks to Kristian Rosenvold.
o New methods in ZipArchiveOutputStream and ZipFile allows
  entries to be copied from one archive to another without
  having to re-compress them.
  Issue: COMPRESS-295. Thanks to Kristian Rosenvold.

Fixed Bugs:
o TarArchiveInputStream can now read entries with group or
  user ids > 0x80000000.
  Issue: COMPRESS-314.
o TarArchiveOutputStream can now write entries with group or
  user ids > 0x80000000.
  Issue: COMPRESS-315.
o TarArchiveEntry's constructor with a File and a String arg
  didn't normalize the name.
  Issue: COMPRESS-312.
o ZipEncodingHelper no longer reads system properties directly
  to determine the default charset.
  Issue: COMPRESS-308.
o BZip2CompressorInputStream#read would return -1 when asked to
  read 0 bytes.
  Issue: COMPRESS-309.
o ArchiveStreamFactory fails to pass on the encoding when creating
  some streams.
    * ArjArchiveInputStream
    * CpioArchiveInputStream
    * DumpArchiveInputStream
    * JarArchiveInputStream
    * TarArchiveInputStream
    * JarArchiveOutputStream
  Issue: COMPRESS-306.
o Restore immutability/thread-safety to ArchiveStreamFactory.
  The class is now immutable provided that the method setEntryEncoding
  is not used. The class is thread-safe.
  Issue: COMPRESS-302.
o Restore immutability/thread-safety to CompressorStreamFactory.
  The class is now immutable provided that the method
  setDecompressConcatenated is not used.  The class is thread-safe.
  Issue: COMPRESS-303.
o ZipFile logs a warning in its finalizer when its constructor
  has thrown an exception reading the file - for example if the
  file doesn't exist.
  Issue: COMPRESS-297.
o Improved error message when tar encounters a groupId that is
  too big to write without using the STAR or POSIX format.
  Issue: COMPRESS-290. Thanks to Kristian Rosenvold.
o SevenZFile now throws the specific PasswordRequiredException
  when it encounters an encrypted stream but no password has
  been specified.
  Issue: COMPRESS-298.

Changes:
o Moved the package
  org.apache.commons.compress.compressors.z._internal_ to
  org.apache.commons.compress.compressors.lzw and made it part
  of the API that is officially supported.  This will break
  existing code that uses the old package. Thanks to Damjan Jovanovic.

For complete information on Apache Commons Compress, including instructions
on how to submit bug reports, patches, or suggestions for improvement,
see the Apache Commons Compress website:

https://commons.apache.org/compress/

Old Release Notes
=================

Release 1.9
-----------

New features:
o Added support for DEFLATE streams without any gzip framing.
  Issue: COMPRESS-263.
  Thanks to Matthias Stevens.

Fixed Bugs:
o When reading 7z files unknown file properties and properties of type
  kDummy are now ignored.
  Issue: COMPRESS-287.
o Expanding 7z archives using LZMA compression could cause an
  EOFException.
  Issue: COMPRESS-286.
o Long-Name and -link or PAX-header entries in TAR archives always had
  the current time as last modfication time, creating archives that
  are different at the byte level each time an archive was built.
  Issue: COMPRESS-289.
  Thanks to Bob Robertson.

Changes:
o Checking for XZ for Java may be expensive.  The result will now be
  cached outside of an OSGi environment.  You can use the new
  XZUtils#setCacheXZAvailability to overrride this default behavior.
  Issue: COMPRESS-285.

Release 1.8.1
-------------

New features:
o COMPRESS-272:  CompressorStreamFactory can now auto-detect Unix compress
                 (".Z") streams.

Fixed Bugs:
o COMPRESS-270:  The snappy, ar and tar inputstreams might fail to read from a
                 non-buffered stream in certain cases.
o COMPRESS-277:  IOUtils#skip might skip fewer bytes than requested even though
                 more could be read from the stream.
o COMPRESS-276:  ArchiveStreams now validate there is a current entry before
                 reading or writing entry data.
o ArjArchiveInputStream#canReadEntryData tested the current
                 entry of the stream rather than its argument.
o COMPRESS-274:  ChangeSet#delete and deleteDir now properly deal with unnamed
                 entries.
o COMPRESS-273:  Added a few null checks to improve robustness.
o COMPRESS-278:  TarArchiveInputStream failed to read archives with empty
                 gid/uid fields.
o COMPRESS-279:  TarArchiveInputStream now again throws an exception when it
                 encounters a truncated archive while reading from the last
                 entry.
o COMPRESS-280:  Adapted TarArchiveInputStream#skip to the modified
                 IOUtils#skip method. Thanks to BELUGA BEHR.

Changes:
o The dependency on org.tukaani:xz is now marked as optional.

Release 1.8
-----------

New features:
o GzipCompressorInputStream now provides access to the same
  metadata that can be provided via GzipParameters when writing
  a gzip stream.
  Issue: COMPRESS-260.
o SevenZOutputFile now supports chaining multiple
  compression/encryption/filter methods and passing options to
  the methods.
  Issue: COMPRESS-266.
o The (compression) method(s) can now be specified per entry in
  SevenZOutputFile.
  Issue: COMPRESS-261.
o SevenZArchiveEntry "knows" which method(s) have been used to
  write it to the archive.
  Issue: COMPRESS-258.
o The 7z package now supports the delta filter as method.
o The 7z package now supports BCJ filters for several platforms.
  You will need a version >= 1.5 of XZ for Java to read archives
  using BCJ, though.
  Issue: COMPRESS-257.

Fixed Bugs:
o BZip2CompressorInputStream read fewer bytes than possible from
  a truncated stream.
  Issue: COMPRESS-253.
o SevenZFile failed claiming the dictionary was too large when
  archives used LZMA compression for headers and content and
  certain non-default dictionary sizes.
  Issue: COMPRESS-253.
o CompressorStreamFactory.createCompressorInputStream with
  explicit compression did not honor decompressConcatenated
  Issue: COMPRESS-259.
o TarArchiveInputStream will now read archives created by tar
  implementations that encode big numbers by not adding a
  trailing NUL.
  Issue: COMPRESS-262.
o ZipArchiveInputStream would return NUL bytes for the first 512
  bytes of a STORED entry if it was the very first entry of the
  archive.
  Issue: COMPRESS-264.
o When writing PAX/POSIX headers for TAR entries with
  backslashes or certain non-ASCII characters in their name
  TarArchiveOutputStream could fail.
  Issue: COMPRESS-265.
o ArchiveStreamFactory now throws a StreamingNotSupported - a
  new subclass of ArchiveException - if it is asked to read from
  or write to a stream and Commons Compress doesn't support
  streaming for the format.  This currently only applies to the
  7z format.
  Issue: COMPRESS-267.

Release 1.7
-----------

New features:
o Read-Only support for Snappy compression.
  Issue: COMPRESS-147. Thanks to BELUGA BEHR.
o Read-Only support for .Z compressed files.
  Issue: COMPRESS-243. Thanks to Damjan Jovanovic.
o ZipFile and ZipArchiveInputStream now support reading entries
  compressed using the SHRINKING method. Thanks to Damjan Jovanovic.
o GzipCompressorOutputStream now supports setting the compression
  level and the header metadata (filename, comment, modification time,
  operating system and extra flags)
  Issue: COMPRESS-250. Thanks to Emmanuel Bourg.
o ZipFile and ZipArchiveInputStream now support reading entries
  compressed using the IMPLODE method.
  Issue: COMPRESS-115. Thanks to Emmanuel Bourg.
o ZipFile and the 7z file classes now implement Closeable and can be
  used in try-with-resources constructs.

Fixed Bugs:
o SevenZOutputFile#closeArchiveEntry throws an exception when using
  LZMA2 compression on Java8.  Issue: COMPRESS-241.
o 7z reading of big 64bit values could be wrong.
  Issue: COMPRESS-244. Thanks to Nico Kruber.
o TarArchiveInputStream could fail to read an archive completely.
  Issue: COMPRESS-245.
o The time-setters in X5455_ExtendedTimestamp now set the
  corresponding flags explicitly - i.e. they set the bit if the valus
  is not-null and reset it otherwise.  This may cause
  incompatibilities if you use setFlags to unset a bit and later set
  the time to a non-null value - the flag will now be set.
  Issue: COMPRESS-242.
o SevenZOutputFile would create invalid archives if more than six
  empty files or directories were included.  Issue: COMPRESS-252.

Release 1.6
-----------

Version 1.6 introduces changes to the internal API of the tar package that
break backwards compatibility in the following rare cases.  This version
removes the package private TarBuffer class along with the protected "buffer"
members in TarArchiveInputStream and TarArchiveOutputStream.  This change will
only affect you if you have created a subclass of one of the stream classes
and accessed the buffer member or directly used the TarBuffer class.

Changes in this version include:

New features:
o Added support for 7z archives.  Most compression algorithms
  can be read and written, LZMA and encryption are only
  supported when reading.  Issue: COMPRESS-54. Thanks to Damjan Jovanovic.
o Added read-only support for ARJ archives that don't use
  compression.  Issue: COMPRESS-226. Thanks to Damjan Jovanovic.
o DumpArchiveInputStream now supports an encoding parameter that
  can be used to specify the encoding of file names.
o The CPIO streams now support an encoding parameter that can be
  used to specify the encoding of file names.
o Read-only support for LZMA standalone compression has been added.
  Issue: COMPRESS-111.

Fixed Bugs:
o TarBuffer.tryToConsumeSecondEOFRecord could throw a
  NullPointerException  Issue: COMPRESS-223. Thanks to Jeremy Gustie.
o Parsing of zip64 extra fields has become more lenient in order
  to be able to read archives created by DotNetZip and maybe
  other archivers as well.  Issue: COMPRESS-228.
o TAR will now properly read the names of symbolic links with
  long names that use the GNU variant to specify the long file
  name.  Issue: COMPRESS-229. Thanks to Christoph Gysin.
o ZipFile#getInputStream could return null if the archive
  contained duplicate entries.
  The class now also provides two new methods to obtain all
  entries of a given name rather than just the first one.
  Issue: COMPRESS-227.
o CpioArchiveInputStream failed to read archives created by
  Redline RPM.  Issue: COMPRESS-236. Thanks to Andrew Duffy.
o TarArchiveOutputStream now properly handles link names that
  are too long to fit into a traditional TAR header.  Issue:
  COMPRESS-237. Thanks to Emmanuel Bourg.
o The auto-detecting create*InputStream methods of Archive and
  CompressorStreamFactory could fail to detect the format of
  blocking input streams.  Issue: COMPRESS-239.

Changes:
o Readabilty patch to TarArchiveInputStream.  Issue:
  COMPRESS-232. Thanks to BELUGA BEHR.
o Performance improvements to TarArchiveInputStream, in
  particular to the skip method.  Issue: COMPRESS-234. Thanks to
  BELUGA BEHR.

Release 1.5
-----------

New features:

o CompressorStreamFactory has an option to create decompressing
  streams that decompress the full input for formats that support
  multiple concatenated streams.
  Issue: COMPRESS-220.

Fixed Bugs:

o Typo in CompressorStreamFactory Javadoc
  Issue: COMPRESS-218.
  Thanks to Gili.
o ArchiveStreamFactory's tar stream detection created false positives
  for AIFF files.
  Issue: COMPRESS-191.
  Thanks to Jukka Zitting.
o XZ for Java didn't provide an OSGi bundle.  Compress' dependency on
  it has now been marked optional so Compress itself can still be used
  in an OSGi context.
  Issue: COMPRESS-199.
  Thanks to Jukka Zitting.
o When specifying the encoding explicitly TarArchiveOutputStream would
  write unreadable names in GNU mode or even cause errors in POSIX
  mode for file names longer than 66 characters.
  Issue: COMPRESS-200.
  Thanks to Christian Schlichtherle.
o Writing TAR PAX headers failed if the generated entry name ended
  with a "/".
  Issue: COMPRESS-203.
o ZipArchiveInputStream sometimes failed to provide input to the
  Inflater when it needed it, leading to reads returning 0.
  Issue: COMPRESS-189.
  Thanks to Daniel Lowe.
o TarArchiveInputStream ignored the encoding for GNU long name
  entries.
  Issue: COMPRESS-212.
o TarArchiveInputStream could leave the second EOF record inside the
  stream it had just finished reading.
  Issue: COMPRESS-206.
  Thanks to Peter De Maeyer.
o DumpArchiveInputStream no longer implicitly closes the original
  input stream when it reaches the end of the archive.
o ZipArchiveInputStream now consumes the remainder of the archive when
  getNextZipEntry returns null.
o Unit tests could fail if the source tree was checked out to a
  directory tree containign spaces.
  Issue: COMPRESS-205.
  Thanks to Daniel Lowe.
o Fixed a potential ArrayIndexOutOfBoundsException when reading STORED
  entries from ZipArchiveInputStream.
  Issue: COMPRESS-219.
o CompressorStreamFactory can now be used without XZ for Java being
  available.
  Issue: COMPRESS-221.

Changes:

o Improved exception message if a zip archive cannot be read because
  of an unsupported compression method.
  Issue: COMPRESS-188.
  Thanks to Harald Kuhn.
o ArchiveStreamFactory has a setting for file name encoding that sets
  up encoding for ZIP and TAR streams.
  Issue: COMPRESS-192.
  Thanks to Jukka Zitting.
o TarArchiveEntry now has a method to verify its checksum.
  Issue: COMPRESS-191.
  Thanks to Jukka Zitting.
o Split/spanned ZIP archives are now properly detected by
  ArchiveStreamFactory but will cause an
  UnsupportedZipFeatureException when read.
o ZipArchiveInputStream now reads archives that start with a "PK00"
  signature.  Archives with this signatures are created when the
  archiver was willing to split the archive but in the end only needed
  a single segment - so didn't split anything.
  Issue: COMPRESS-208.
o TarArchiveEntry has a new constructor that allows setting linkFlag
  and preserveLeadingSlashes at the same time.
  Issue: COMPRESS-201.
o ChangeSetPerformer has a new perform overload that uses a ZipFile
  instance as input.
  Issue: COMPRESS-159.
o Garbage collection pressure has been reduced by reusing temporary
  byte arrays in classes.
  Issue: COMPRESS-172.
  Thanks to Thomas Mair.
o Can now handle zip extra field 0x5455 - Extended Timestamp.
  Issue: COMPRESS-210.
  Thanks to Julius Davies.
o handle zip extra field 0x7875 - Info Zip New Unix Extra Field.
  Issue: COMPRESS-211.
  Thanks to Julius Davies.
o ZipShort, ZipLong, ZipEightByteInteger should implement Serializable
  Issue: COMPRESS-213.
  Thanks to Julius Davies.
o better support for unix symlinks in ZipFile entries.
  Issue: COMPRESS-214.
  Thanks to Julius Davies.
o ZipFile's initialization has been improved for non-Zip64 archives.
  Issue: COMPRESS-215.
  Thanks to Robin Power.
o Updated XZ for Java dependency to 1.2 as this version provides
  proper OSGi manifest attributes.

Release 1.4.1
-------------

This is a security bugfix release, see
https://commons.apache.org/proper/commons-compress/security.html#Fixed_in_Apache_Commons_Compress_1.4.1

Fixed Bugs:

o Ported libbzip2's fallback sort algorithm to
  BZip2CompressorOutputStream to speed up compression in certain
  edge cases.

Release 1.4
-----------

New features:
o COMPRESS-156:  Support for the XZ format has been added.

Fixed Bugs:
o COMPRESS-183:  The tar package now allows the encoding of file names to be
                 specified and can optionally use PAX extension headers to
                 write non-ASCII file names.
                 The stream classes now write (or expect to read) archives that
                 use the platform's native encoding for file names.  Apache
                 Commons Compress 1.3 used to strip everything but the lower
                 eight bits of each character which effectively only worked for
                 ASCII and ISO-8859-1 file names.
                 This new default behavior is a breaking change.
o COMPRESS-184:  TarArchiveInputStream failed to parse PAX headers that
                 contained non-ASCII characters.
o COMPRESS-178:  TarArchiveInputStream throws IllegalArgumentException instead of IOException
o COMPRESS-179:  TarUtils.formatLongOctalOrBinaryBytes() assumes the field will be 12 bytes long
o COMPRESS-175:  GNU Tar sometimes uses binary encoding for UID and GID
o COMPRESS-171:  ArchiveStreamFactory.createArchiveInputStream would claim
                 short text files were TAR archives.
o COMPRESS-164:  ZipFile didn't work properly for archives using unicode extra
                 fields rather than UTF-8 filenames and the EFS-Flag.
o COMPRESS-169:  For corrupt archives ZipFile would throw a RuntimeException in
                 some cases and an IOException in others.  It will now
                 consistently throw an IOException.

Changes:
o COMPRESS-182:  The tar package can now write archives that use star/GNU/BSD
                 extensions or use the POSIX/PAX variant to store numeric
                 values that don't fit into the traditional header fields.
o COMPRESS-181:  Added a workaround for a Bug some tar implementations that add
                 a NUL byte as first byte in numeric header fields.
o COMPRESS-176:  Added a workaround for a Bug in WinZIP which uses backslashes
                 as path separators in Unicode Extra Fields.
o COMPRESS-131:  ArrayOutOfBounds while decompressing bz2. Added test case - code already seems to have been fixed.
o COMPRESS-146:  BZip2CompressorInputStream now optionally supports reading of
                 concatenated .bz2 files.
o COMPRESS-154:  GZipCompressorInputStream now optionally supports reading of
                 concatenated .gz files.
o COMPRESS-16:  The tar package can now read archives that use star/GNU/BSD
                 extensions for files that are longer than 8 GByte as well as
                 archives that use the POSIX/PAX variant.
o COMPRESS-165:  The tar package can now write archives that use star/GNU/BSD
                 extensions for files that are longer than 8 GByte as well as
                 archives that use the POSIX/PAX variant.
o COMPRESS-166:  The tar package can now use the POSIX/PAX variant for writing
                 entries with names longer than 100 characters.

Release 1.3
-----------

Commons Compress 1.3 is the first version to require Java5 at runtime.

Changes in this version include:

New features:
o Support for the Pack200 format has been added.  Issue: COMPRESS-142.
o Read-only support for the format used by the Unix dump(8) tool
  has been added.  Issue: COMPRESS-132.

Fixed Bugs:
o BZip2CompressorInputStream's getBytesRead method always
  returned 0.
o ZipArchiveInputStream and ZipArchiveOutputStream could leak
  resources on some JDKs.  Issue: COMPRESS-152.
o TarArchiveOutputStream's getBytesWritten method didn't count
  correctly.  Issue: COMPRESS-160.

Changes:
o The ZIP package now supports Zip64 extensions.  Issue: COMPRESS-36.
o The AR package now supports the BSD dialect of storing file
  names longer than 16 chars (both reading and writing).
  Issue: COMPRESS-144.

Release 1.2
-----------

New features:
o COMPRESS-123:  ZipArchiveEntry has a new method getRawName that provides the
        original bytes that made up the name.  This may allow user
        code to detect the encoding.
o COMPRESS-122:  TarArchiveEntry provides access to the flags that determine
        whether it is an archived symbolic link, pipe or other
        "uncommon" file system object.

Fixed Bugs:
o COMPRESS-129:  ZipArchiveInputStream could fail with a "Truncated ZIP" error
        message for entries between 2 GByte and 4 GByte in size.
o COMPRESS-145:  TarArchiveInputStream now detects sparse entries using the
        oldgnu format and properly reports it cannot extract their
        contents.
o COMPRESS-130:  The Javadoc for ZipArchiveInputStream#skip now matches the
        implementation, the code has been made more defensive.
o COMPRESS-140:  ArArchiveInputStream fails if entries contain only blanks for
        userId or groupId. Thanks to Trejkaz.
o COMPRESS-139:  ZipFile may leak resources on some JDKs.
o COMPRESS-125:  BZip2CompressorInputStream throws IOException if
        underlying stream returns available() == 0.
        Removed the check.
o COMPRESS-127:  Calling close() on inputStream returned by
        CompressorStreamFactory.createCompressorInputStream()
        does not close the underlying input stream.
o COMPRESS-119:  TarArchiveOutputStream#finish now writes all buffered
        data to the stream

Changes:
o ZipFile now implements finalize which closes the underlying
        file.
o COMPRESS-117:  Certain tar files not recognised by
        ArchiveStreamFactory.

Release 1.1
-----------

New features:
o COMPRESS-108:  Command-line interface to list archive contents.
       Usage: java -jar commons-compress-n.m.jar archive-name [zip|tar|etc]
o COMPRESS-109:  Tar implementation does not support Pax headers
       Added support for reading pax headers.
       Note: does not support global pax headers
o COMPRESS-103:  ZipArchiveInputStream can optionally extract data that used
        the STORED compression method and a data descriptor.
        Doing so in a stream is not safe in general, so you have to
        explicitly enable the feature.  By default the stream will
        throw an exception if it encounters such an entry.
o COMPRESS-98:  The ZIP classes will throw specialized exceptions if any
        attempt is made to read or write data that uses zip features
        not supported (yet).
o COMPRESS-99:  ZipFile#getEntries returns entries in a predictable order -
        the order they appear inside the central directory.
        A new method getEntriesInPhysicalOrder returns entries in
        order of the entry data, i.e. the order ZipArchiveInputStream
        would see.
o The Archive*Stream and ZipFile classes now have
        can(Read|Write)EntryData methods that can be used to check
        whether a given entry's data can be read/written.
        The method currently returns false for ZIP archives if an
        entry uses an unsupported compression method or encryption.
o COMPRESS-89:  The ZIP classes now detect encrypted entries.
o COMPRESS-97:  Added autodetection of compression format to
        CompressorStreamFactory.
o COMPRESS-95:  Improve ExceptionMessages in ArchiveStreamFactory Thanks to Joerg Bellmann.
o A new constructor of TarArchiveEntry can create entries with
        names that start with slashes - the default is to strip
        leading slashes in order to create relative path names.
o ArchiveEntry now has a getLastModifiedDate method.
o COMPRESS-78:  Add a BZip2Utils class modelled after GZipUtils Thanks to Jukka Zitting.

Fixed Bugs:
o COMPRESS-72:  Move acknowledgements from NOTICE to README
o COMPRESS-113:  TarArchiveEntry.parseTarHeader() includes the trailing space/NUL when parsing the octal size
o COMPRESS-118:  TarUtils.parseName does not properly handle characters outside the range 0-127
o COMPRESS-107:  ArchiveStreamFactory does not recognise tar files created by Ant
o COMPRESS-110:  Support "ustar" prefix field, which is used when file paths are longer
       than 100 characters.
o COMPRESS-100:  ZipArchiveInputStream will throw an exception if it detects an
        entry that uses a data descriptor for a STORED entry since it
        cannot reliably find the end of data for this "compression"
        method.
o COMPRESS-101:  ZipArchiveInputStream should now properly read archives that
        use data descriptors but without the "unofficial" signature.
o COMPRESS-74:  ZipArchiveInputStream failed to update the number of bytes
        read properly.
o ArchiveInputStream has a new method getBytesRead that should
        be preferred over getCount since the later may truncate the
        number of bytes read for big archives.
o COMPRESS-85:  The cpio archives created by CpioArchiveOutputStream couldn't
        be read by many existing native implementations because the
        archives contained multiple entries with the same inode/device
        combinations and weren't padded to a blocksize of 512 bytes.
o COMPRESS-73:  ZipArchiveEntry, ZipFile and ZipArchiveInputStream are now
        more lenient when parsing extra fields.
o COMPRESS-82:  cpio is terribly slow.
        Documented that buffered streams are needed for performance
o Improved exception message if the extra field data in ZIP
        archives cannot be parsed.
o COMPRESS-17:  Tar format unspecified - current support documented.
o COMPRESS-94:  ZipArchiveEntry's equals method was broken for entries created
        with the String-arg constructor.  This lead to broken ZIP
        archives if two different entries had the same hash code. Thanks to Anon Devs.
o COMPRESS-87:  ZipArchiveInputStream could repeatedly return 0 on read() when
        the archive was truncated. Thanks to Antoni Mylka.
o COMPRESS-86:  Tar archive entries holding the file name for names longer
        than 100 characters in GNU longfile mode didn't properly
        specify they'd be using the "oldgnu" extension.
o COMPRESS-83:  Delegate all read and write methods in GZip stream in order to
        speed up operations.
o The ar and cpio streams now properly read and write last
        modified times.
o COMPRESS-81:  TarOutputStream can leave garbage at the end of the archive

Changes:
o COMPRESS-112:  ArArchiveInputStream does not handle GNU extended filename records (//)
o COMPRESS-105:  Document that the name of an ZipArchiveEntry determines whether
       an entry is considered a directory or not.
       If you don't use the constructor with the File argument the entry's
        name must end in a "/" in order for the entry to be known as a directory.
o COMPRESS-79:  Move DOS/Java time conversions into Zip utility class.
o COMPRESS-75:  ZipArchiveInputStream does not show location in file
       where a problem occurred.

