Class ZipUtil

java.lang.Object
org.zeroturnaround.zip.ZipUtil

public final class ZipUtil extends Object
ZIP file manipulation utilities.
See Also:
  • Field Details

    • PATH_SEPARATOR

      private static final String PATH_SEPARATOR
      See Also:
    • DEFAULT_COMPRESSION_LEVEL

      public static final int DEFAULT_COMPRESSION_LEVEL
      Default compression level
      See Also:
    • log

      private static final org.slf4j.Logger log
  • Constructor Details

    • ZipUtil

      private ZipUtil()
  • Method Details

    • containsEntry

      public static boolean containsEntry(File zip, String name)
      Checks if the ZIP file contains the given entry.
      Parameters:
      zip - ZIP file.
      name - entry name.
      Returns:
      true if the ZIP file contains the given entry.
    • getCompressionLevelOfEntry

      @Deprecated public static int getCompressionLevelOfEntry(File zip, String name)
      Deprecated.
      The compression level cannot be retrieved. This method exists only to ensure backwards compatibility with ZipUtil version 1.9, which returned the compression method, not the level.
      Returns the compression method of a given entry of the ZIP file.
      Parameters:
      zip - ZIP file.
      name - entry name.
      Returns:
      Returns ZipEntry.STORED, ZipEntry.DEFLATED or -1 if the ZIP file does not contain the given entry.
    • getCompressionMethodOfEntry

      public static int getCompressionMethodOfEntry(File zip, String name)
      Returns the compression method of a given entry of the ZIP file.
      Parameters:
      zip - ZIP file.
      name - entry name.
      Returns:
      Returns ZipEntry.STORED, ZipEntry.DEFLATED or -1 if the ZIP file does not contain the given entry.
    • containsAnyEntry

      public static boolean containsAnyEntry(File zip, String[] names)
      Checks if the ZIP file contains any of the given entries.
      Parameters:
      zip - ZIP file.
      names - entry names.
      Returns:
      true if the ZIP file contains any of the given entries.
    • unpackEntry

      public static byte[] unpackEntry(File zip, String name)
      Unpacks a single entry from a ZIP file.
      Parameters:
      zip - ZIP file.
      name - entry name.
      Returns:
      contents of the entry or null if it was not found.
    • unpackEntry

      public static byte[] unpackEntry(File zip, String name, Charset charset)
      Unpacks a single entry from a ZIP file.
      Parameters:
      zip - ZIP file.
      name - entry name.
      charset - charset to be used to process the zip
      Returns:
      contents of the entry or null if it was not found.
    • unpackEntry

      public static byte[] unpackEntry(ZipFile zf, String name)
      Unpacks a single entry from a ZIP file.
      Parameters:
      zf - ZIP file.
      name - entry name.
      Returns:
      contents of the entry or null if it was not found.
    • doUnpackEntry

      private static byte[] doUnpackEntry(ZipFile zf, String name) throws IOException
      Unpacks a single entry from a ZIP file.
      Parameters:
      zf - ZIP file.
      name - entry name.
      Returns:
      contents of the entry or null if it was not found.
      Throws:
      IOException
    • unpackEntry

      public static byte[] unpackEntry(InputStream is, String name)
      Unpacks a single entry from a ZIP stream.
      Parameters:
      is - ZIP stream.
      name - entry name.
      Returns:
      contents of the entry or null if it was not found.
    • unpackEntry

      public static boolean unpackEntry(File zip, String name, File file)
      Unpacks a single file from a ZIP archive to a file.
      Parameters:
      zip - ZIP file.
      name - entry name.
      file - target file to be created or overwritten.
      Returns:
      true if the entry was found and unpacked, false if the entry was not found.
    • unpackEntry

      public static boolean unpackEntry(File zip, String name, File file, Charset charset)
      Unpacks a single file from a ZIP archive to a file.
      Parameters:
      zip - ZIP file.
      name - entry name.
      file - target file to be created or overwritten.
      charset - charset to be used processing the zip
      Returns:
      true if the entry was found and unpacked, false if the entry was not found.
    • unpackEntry

      public static boolean unpackEntry(ZipFile zf, String name, File file)
      Unpacks a single file from a ZIP archive to a file.
      Parameters:
      zf - ZIP file.
      name - entry name.
      file - target file to be created or overwritten.
      Returns:
      true if the entry was found and unpacked, false if the entry was not found.
    • doUnpackEntry

      private static boolean doUnpackEntry(ZipFile zf, String name, File file) throws IOException
      Unpacks a single file from a ZIP archive to a file.
      Parameters:
      zf - ZIP file.
      name - entry name.
      file - target file to be created or overwritten.
      Returns:
      true if the entry was found and unpacked, false if the entry was not found.
      Throws:
      IOException
    • unpackEntry

      public static boolean unpackEntry(InputStream is, String name, File file) throws IOException
      Unpacks a single file from a ZIP stream to a file.
      Parameters:
      is - ZIP stream.
      name - entry name.
      file - target file to be created or overwritten.
      Returns:
      true if the entry was found and unpacked, false if the entry was not found.
      Throws:
      IOException - if file is not found or writing to it fails
    • iterate

      public static void iterate(File zip, ZipEntryCallback action)
      Reads the given ZIP file and executes the given action for each entry.

      For each entry the corresponding input stream is also passed to the action. If you want to stop the loop then throw a ZipBreakException.

      Parameters:
      zip - input ZIP file.
      action - action to be called for each entry.
      See Also:
    • iterate

      public static void iterate(File zip, ZipEntryCallback action, Charset charset)
      Reads the given ZIP file and executes the given action for each entry.

      For each entry the corresponding input stream is also passed to the action. If you want to stop the loop then throw a ZipBreakException.

      Parameters:
      zip - input ZIP file.
      action - action to be called for each entry.
      charset - Charset used to processed the ZipFile with
      See Also:
    • iterate

      public static void iterate(File zip, String[] entryNames, ZipEntryCallback action)
      Reads the given ZIP file and executes the given action for each given entry.

      For each given entry the corresponding input stream is also passed to the action. If you want to stop the loop then throw a ZipBreakException.

      Parameters:
      zip - input ZIP file.
      entryNames - names of entries to iterate
      action - action to be called for each entry.
      See Also:
    • iterate

      public static void iterate(File zip, String[] entryNames, ZipEntryCallback action, Charset charset)
      Reads the given ZIP file and executes the given action for each given entry.

      For each given entry the corresponding input stream is also passed to the action. If you want to stop the loop then throw a ZipBreakException.

      Parameters:
      zip - input ZIP file.
      entryNames - names of entries to iterate
      action - action to be called for each entry.
      charset - charset used to process the zip file
      See Also:
    • iterate

      public static void iterate(File zip, ZipInfoCallback action)
      Scans the given ZIP file and executes the given action for each entry.

      Only the meta-data without the actual data is read. If you want to stop the loop then throw a ZipBreakException.

      Parameters:
      zip - input ZIP file.
      action - action to be called for each entry.
      See Also:
    • iterate

      public static void iterate(File zip, String[] entryNames, ZipInfoCallback action)
      Scans the given ZIP file and executes the given action for each given entry.

      Only the meta-data without the actual data is read. If you want to stop the loop then throw a ZipBreakException.

      Parameters:
      zip - input ZIP file.
      entryNames - names of entries to iterate
      action - action to be called for each entry.
      See Also:
    • iterate

      public static void iterate(InputStream is, ZipEntryCallback action, Charset charset)
      Reads the given ZIP stream and executes the given action for each entry.

      For each entry the corresponding input stream is also passed to the action. If you want to stop the loop then throw a ZipBreakException.

      Parameters:
      is - input ZIP stream (it will not be closed automatically).
      action - action to be called for each entry.
      charset - charset to process entries in
      See Also:
    • iterate

      public static void iterate(InputStream is, ZipEntryCallback action)
      See iterate(InputStream, ZipEntryCallback, Charset). This method is a shorthand for a version where no Charset is specified.
      Parameters:
      is - input ZIP stream (it will not be closed automatically).
      action - action to be called for each entry.
      See Also:
    • iterate

      public static void iterate(InputStream is, String[] entryNames, ZipEntryCallback action, Charset charset)
      Reads the given ZIP stream and executes the given action for each given entry.

      For each given entry the corresponding input stream is also passed to the action. If you want to stop the loop then throw a ZipBreakException.

      Parameters:
      is - input ZIP stream (it will not be closed automatically).
      entryNames - names of entries to iterate
      action - action to be called for each entry.
      charset - charset to process entries in
      See Also:
    • iterate

      public static void iterate(InputStream is, String[] entryNames, ZipEntryCallback action)
      See @link{ iterate(InputStream, ZipEntryCallback, Charset). It is a shorthand where no Charset is specified.
      Parameters:
      is - input ZIP stream (it will not be closed automatically).
      entryNames - names of entries to iterate
      action - action to be called for each entry.
      See Also:
    • newCloseShieldZipInputStream

      private static ZipInputStream newCloseShieldZipInputStream(InputStream is, Charset charset)
      Creates a new ZipInputStream based on the given InputStream. It will be buffered and close-shielded. Closing the result stream flushes the buffers and frees up resources of the ZipInputStream. However the source stream itself remains open.
    • handle

      public static boolean handle(File zip, String name, ZipEntryCallback action)
      Reads the given ZIP file and executes the given action for a single entry.
      Parameters:
      zip - input ZIP file.
      name - entry name.
      action - action to be called for this entry.
      Returns:
      true if the entry was found, false if the entry was not found.
      See Also:
    • handle

      public static boolean handle(InputStream is, String name, ZipEntryCallback action)
      Reads the given ZIP stream and executes the given action for a single entry.
      Parameters:
      is - input ZIP stream (it will not be closed automatically).
      name - entry name.
      action - action to be called for this entry.
      Returns:
      true if the entry was found, false if the entry was not found.
      See Also:
    • unpack

      public static void unpack(File zip, File outputDir)
      Unpacks a ZIP file to the given directory.

      The output directory must not be a file.

      Parameters:
      zip - input ZIP file.
      outputDir - output directory (created automatically if not found).
    • unpack

      public static void unpack(File zip, File outputDir, Charset charset)
      Unpacks a ZIP file to the given directory using a specific Charset for the input file.

      The output directory must not be a file.

      Parameters:
      zip - input ZIP file.
      outputDir - output directory (created automatically if not found).
      charset - charset used to unpack the zip file
    • unpack

      public static void unpack(File zip, File outputDir, NameMapper mapper, Charset charset)
      Unpacks a ZIP file to the given directory.

      The output directory must not be a file.

      Parameters:
      zip - input ZIP file.
      outputDir - output directory (created automatically if not found).
      mapper - call-back for renaming the entries.
      charset - charset used to process the zip file
    • unpack

      public static void unpack(File zip, File outputDir, NameMapper mapper)
      Unpacks a ZIP file to the given directory using a specific Charset for the input file.

      The output directory must not be a file.

      Parameters:
      zip - input ZIP file.
      outputDir - output directory (created automatically if not found).
      mapper - call-back for renaming the entries.
    • unwrap

      public static void unwrap(File zip, File outputDir)
      Unwraps a ZIP file to the given directory shaving of root dir. If there are multiple root dirs or entries in the root of zip, ZipException is thrown.

      The output directory must not be a file.

      Parameters:
      zip - input ZIP file.
      outputDir - output directory (created automatically if not found).
    • unwrap

      public static void unwrap(File zip, File outputDir, NameMapper mapper)
      Unwraps a ZIP file to the given directory shaving of root dir. If there are multiple root dirs or entries in the root of zip, ZipException is thrown.

      The output directory must not be a file.

      Parameters:
      zip - input ZIP file.
      outputDir - output directory (created automatically if not found).
      mapper - call-back for renaming the entries.
    • unpack

      public static void unpack(InputStream is, File outputDir)
      Unpacks a ZIP stream to the given directory.

      The output directory must not be a file.

      Parameters:
      is - inputstream for ZIP file.
      outputDir - output directory (created automatically if not found).
    • unpack

      public static void unpack(InputStream is, File outputDir, Charset charset)
      Unpacks a ZIP stream to the given directory.

      The output directory must not be a file.

      Parameters:
      is - inputstream for ZIP file.
      outputDir - output directory (created automatically if not found).
      charset - charset used to process the zip stream
    • unpack

      public static void unpack(InputStream is, File outputDir, NameMapper mapper)
      Unpacks a ZIP stream to the given directory.

      The output directory must not be a file.

      Parameters:
      is - inputstream for ZIP file.
      outputDir - output directory (created automatically if not found).
      mapper - call-back for renaming the entries.
    • unpack

      public static void unpack(InputStream is, File outputDir, NameMapper mapper, Charset charset)
      Unpacks a ZIP stream to the given directory.

      The output directory must not be a file.

      Parameters:
      is - inputstream for ZIP file.
      outputDir - output directory (created automatically if not found).
      mapper - call-back for renaming the entries.
      charset - charset to use when unpacking the stream
    • unwrap

      public static void unwrap(InputStream is, File outputDir)
      Unwraps a ZIP file to the given directory shaving of root dir. If there are multiple root dirs or entries in the root of zip, ZipException is thrown.

      The output directory must not be a file.

      Parameters:
      is - inputstream for ZIP file.
      outputDir - output directory (created automatically if not found).
    • unwrap

      public static void unwrap(InputStream is, File outputDir, NameMapper mapper)
      Unwraps a ZIP file to the given directory shaving of root dir. If there are multiple root dirs or entries in the root of zip, ZipException is thrown.

      The output directory must not be a file.

      Parameters:
      is - inputstream for ZIP file.
      outputDir - output directory (created automatically if not found).
      mapper - call-back for renaming the entries.
    • makeDestinationFile

      private static File makeDestinationFile(File outputDir, String name) throws IOException
      Throws:
      IOException
    • checkDestinationFileForTraversal

      private static File checkDestinationFileForTraversal(File outputDir, String name, File destFile) throws IOException
      Throws:
      IOException
    • explode

      public static void explode(File zip)
      Unpacks a ZIP file to its own location.

      The ZIP file will be first renamed (using a temporary name). After the extraction it will be deleted.

      Parameters:
      zip - input ZIP file as well as the target directory.
      See Also:
    • packEntry

      public static byte[] packEntry(File file)
      Compresses the given file into a ZIP file with single entry.
      Parameters:
      file - file to be compressed.
      Returns:
      ZIP file created.
    • pack

      public static void pack(File rootDir, File zip)
      Compresses the given directory and all its sub-directories into a ZIP file.

      The ZIP file must not be a directory and its parent directory must exist. Will not include the root directory name in the archive.

      Parameters:
      rootDir - root directory.
      zip - ZIP file that will be created or overwritten.
    • pack

      public static void pack(File rootDir, File zip, int compressionLevel)
      Compresses the given directory and all its sub-directories into a ZIP file.

      The ZIP file must not be a directory and its parent directory must exist. Will not include the root directory name in the archive.

      Parameters:
      rootDir - root directory.
      zip - ZIP file that will be created or overwritten.
      compressionLevel - compression level
    • pack

      public static void pack(File sourceDir, File targetZipFile, boolean preserveRoot)
      Compresses the given directory and all its sub-directories into a ZIP file.

      The ZIP file must not be a directory and its parent directory must exist. Will not include the root directory name in the archive.

      Parameters:
      sourceDir - root directory.
      targetZipFile - ZIP file that will be created or overwritten.
      preserveRoot - true if the resulted archive should have the top directory entry
    • packEntry

      public static void packEntry(File fileToPack, File destZipFile)
      Compresses the given file into a ZIP file.

      The ZIP file must not be a directory and its parent directory must exist.

      Parameters:
      fileToPack - file that needs to be zipped.
      destZipFile - ZIP file that will be created or overwritten.
    • packEntry

      public static void packEntry(File fileToPack, File destZipFile, String fileName)
      Compresses the given file into a ZIP file.

      The ZIP file must not be a directory and its parent directory must exist.

      Parameters:
      fileToPack - file that needs to be zipped.
      destZipFile - ZIP file that will be created or overwritten.
      fileName - the name for the file inside the archive
    • packEntry

      public static void packEntry(File fileToPack, File destZipFile, NameMapper mapper)
      Compresses the given file into a ZIP file.

      The ZIP file must not be a directory and its parent directory must exist.

      Parameters:
      fileToPack - file that needs to be zipped.
      destZipFile - ZIP file that will be created or overwritten.
      mapper - call-back for renaming the entries.
    • packEntries

      public static void packEntries(File[] filesToPack, File destZipFile)
      Compresses the given files into a ZIP file.

      The ZIP file must not be a directory and its parent directory must exist.

      Parameters:
      filesToPack - files that needs to be zipped.
      destZipFile - ZIP file that will be created or overwritten.
    • packEntries

      public static void packEntries(File[] filesToPack, File destZipFile, NameMapper mapper)
      Compresses the given files into a ZIP file.

      The ZIP file must not be a directory and its parent directory must exist.

      Parameters:
      filesToPack - files that needs to be zipped.
      destZipFile - ZIP file that will be created or overwritten.
      mapper - call-back for renaming the entries.
    • packEntries

      public static void packEntries(File[] filesToPack, File destZipFile, int compressionLevel)
      Compresses the given files into a ZIP file.

      The ZIP file must not be a directory and its parent directory must exist.

      Parameters:
      filesToPack - files that needs to be zipped.
      destZipFile - ZIP file that will be created or overwritten.
      compressionLevel - ZIP file compression level (speed versus filesize), e.g. Deflater.NO_COMPRESSION, Deflater.BEST_SPEED, or Deflater.BEST_COMPRESSION
    • packEntries

      public static void packEntries(File[] filesToPack, File destZipFile, NameMapper mapper, int compressionLevel)
      Compresses the given files into a ZIP file.

      The ZIP file must not be a directory and its parent directory must exist.

      Parameters:
      filesToPack - files that needs to be zipped.
      destZipFile - ZIP file that will be created or overwritten.
      mapper - call-back for renaming the entries.
      compressionLevel - ZIP file compression level (speed versus filesize), e.g. Deflater.NO_COMPRESSION, Deflater.BEST_SPEED, or Deflater.BEST_COMPRESSION
    • pack

      public static void pack(File sourceDir, File targetZip, NameMapper mapper)
      Compresses the given directory and all its sub-directories into a ZIP file.

      The ZIP file must not be a directory and its parent directory must exist.

      Parameters:
      sourceDir - root directory.
      targetZip - ZIP file that will be created or overwritten.
      mapper - call-back for renaming the entries.
    • pack

      public static void pack(File sourceDir, File targetZip, NameMapper mapper, int compressionLevel)
      Compresses the given directory and all its sub-directories into a ZIP file.

      The ZIP file must not be a directory and its parent directory must exist.

      Parameters:
      sourceDir - root directory.
      targetZip - ZIP file that will be created or overwritten.
      mapper - call-back for renaming the entries.
      compressionLevel - compression level
    • pack

      public static void pack(File sourceDir, OutputStream os)
      Compresses the given directory and all of its sub-directories into the passed in stream. It is the responsibility of the caller to close the passed in stream properly.
      Parameters:
      sourceDir - root directory.
      os - output stream (will be buffered in this method).
      Since:
      1.10
    • pack

      public static void pack(File sourceDir, OutputStream os, int compressionLevel)
      Compresses the given directory and all of its sub-directories into the passed in stream. It is the responsibility of the caller to close the passed in stream properly.
      Parameters:
      sourceDir - root directory.
      os - output stream (will be buffered in this method).
      compressionLevel - compression level
      Since:
      1.10
    • pack

      public static void pack(File sourceDir, OutputStream os, NameMapper mapper)
      Compresses the given directory and all of its sub-directories into the passed in stream. It is the responsibility of the caller to close the passed in stream properly.
      Parameters:
      sourceDir - root directory.
      os - output stream (will be buffered in this method).
      mapper - call-back for renaming the entries.
      Since:
      1.10
    • pack

      public static void pack(File sourceDir, OutputStream os, NameMapper mapper, int compressionLevel)
      Compresses the given directory and all of its sub-directories into the passed in stream. It is the responsibility of the caller to close the passed in stream properly.
      Parameters:
      sourceDir - root directory.
      os - output stream (will be buffered in this method).
      mapper - call-back for renaming the entries.
      compressionLevel - compression level
      Since:
      1.10
    • pack

      private static void pack(File dir, ZipOutputStream out, NameMapper mapper, String pathPrefix, boolean mustHaveChildren) throws IOException
      Compresses the given directory and all its sub-directories into a ZIP file.
      Parameters:
      dir - root directory.
      out - ZIP output stream.
      mapper - call-back for renaming the entries.
      pathPrefix - prefix to be used for the entries.
      mustHaveChildren - if true, but directory to pack doesn't have any files, throw an exception.
      Throws:
      IOException
    • repack

      public static void repack(File srcZip, File dstZip, int compressionLevel)
      Repacks a provided ZIP file into a new ZIP with a given compression level.

      Parameters:
      srcZip - source ZIP file.
      dstZip - destination ZIP file.
      compressionLevel - compression level.
    • repack

      public static void repack(InputStream is, File dstZip, int compressionLevel)
      Repacks a provided ZIP input stream into a ZIP file with a given compression level.

      Parameters:
      is - ZIP input stream.
      dstZip - destination ZIP file.
      compressionLevel - compression level.
    • repack

      public static void repack(File zip, int compressionLevel)
      Repacks a provided ZIP file and replaces old file with the new one.

      Parameters:
      zip - source ZIP file to be repacked and replaced.
      compressionLevel - compression level.
    • createEmpty

      public static void createEmpty(File file)
      Creates an empty ZIP archive at the location of the provided file.
      Parameters:
      file - the file to become an empty ZIP archive
    • unexplode

      public static void unexplode(File dir)
      Compresses a given directory in its own location.

      A ZIP file will be first created with a temporary name. After the compressing the directory will be deleted and the ZIP file will be renamed as the original directory.

      Parameters:
      dir - input directory as well as the target ZIP file.
      See Also:
    • unexplode

      public static void unexplode(File dir, int compressionLevel)
      Compresses a given directory in its own location.

      A ZIP file will be first created with a temporary name. After the compressing the directory will be deleted and the ZIP file will be renamed as the original directory.

      Parameters:
      dir - input directory as well as the target ZIP file.
      compressionLevel - compression level
      See Also:
    • pack

      public static void pack(ZipEntrySource[] entries, OutputStream os)
      Compresses the given entries into an output stream.
      Parameters:
      entries - ZIP entries added.
      os - output stream for the new ZIP (does not have to be buffered)
      Since:
      1.9
    • pack

      private static void pack(ZipEntrySource[] entries, OutputStream os, boolean closeStream)
    • pack

      public static void pack(ZipEntrySource[] entries, File zip)
      Compresses the given entries into a new ZIP file.
      Parameters:
      entries - ZIP entries added.
      zip - new ZIP file created.
    • addEntry

      public static void addEntry(File zip, String path, File file, File destZip)
      Copies an existing ZIP file and appends it with one new entry.
      Parameters:
      zip - an existing ZIP file (only read).
      path - new ZIP entry path.
      file - new entry to be added.
      destZip - new ZIP file created.
    • addEntry

      public static void addEntry(File zip, String path, File file)
      Changes a zip file, adds one new entry in-place.
      Parameters:
      zip - an existing ZIP file (only read).
      path - new ZIP entry path.
      file - new entry to be added.
    • addEntry

      public static void addEntry(File zip, String path, byte[] bytes, File destZip)
      Copies an existing ZIP file and appends it with one new entry.
      Parameters:
      zip - an existing ZIP file (only read).
      path - new ZIP entry path.
      bytes - new entry bytes (or null if directory).
      destZip - new ZIP file created.
    • addEntry

      public static void addEntry(File zip, String path, byte[] bytes, File destZip, int compressionMethod)
      Copies an existing ZIP file and appends it with one new entry.
      Parameters:
      zip - an existing ZIP file (only read).
      path - new ZIP entry path.
      bytes - new entry bytes (or null if directory).
      destZip - new ZIP file created.
      compressionMethod - the new compression method (ZipEntry.STORED or ZipEntry.DEFLATED).
    • addEntry

      public static void addEntry(File zip, String path, byte[] bytes)
      Changes a zip file, adds one new entry in-place.
      Parameters:
      zip - an existing ZIP file (only read).
      path - new ZIP entry path.
      bytes - new entry bytes (or null if directory).
    • addEntry

      public static void addEntry(File zip, String path, byte[] bytes, int compressionMethod)
      Changes a zip file, adds one new entry in-place.
      Parameters:
      zip - an existing ZIP file (only read).
      path - new ZIP entry path.
      bytes - new entry bytes (or null if directory).
      compressionMethod - the new compression method (ZipEntry.STORED or ZipEntry.DEFLATED).
    • addEntry

      public static void addEntry(File zip, ZipEntrySource entry, File destZip)
      Copies an existing ZIP file and appends it with one new entry.
      Parameters:
      zip - an existing ZIP file (only read).
      entry - new ZIP entry appended.
      destZip - new ZIP file created.
    • addEntry

      public static void addEntry(File zip, ZipEntrySource entry)
      Changes a zip file, adds one new entry in-place.
      Parameters:
      zip - an existing ZIP file (only read).
      entry - new ZIP entry appended.
    • addEntries

      public static void addEntries(File zip, ZipEntrySource[] entries, File destZip)
      Copies an existing ZIP file and appends it with new entries.
      Parameters:
      zip - an existing ZIP file (only read).
      entries - new ZIP entries appended.
      destZip - new ZIP file created.
    • addEntries

      public static void addEntries(File zip, ZipEntrySource[] entries, OutputStream destOut)
      Copies an existing ZIP file and appends it with new entries.
      Parameters:
      zip - an existing ZIP file (only read).
      entries - new ZIP entries appended.
      destOut - new ZIP destination output stream
    • addEntries

      public static void addEntries(InputStream is, ZipEntrySource[] entries, OutputStream destOut)
      Copies an existing ZIP file and appends it with new entries.
      Parameters:
      is - an existing ZIP input stream.
      entries - new ZIP entries appended.
      destOut - new ZIP destination output stream
      Since:
      1.9
    • addEntries

      public static void addEntries(File zip, ZipEntrySource[] entries)
      Changes a zip file it with with new entries. in-place.
      Parameters:
      zip - an existing ZIP file (only read).
      entries - new ZIP entries appended.
    • removeEntry

      public static void removeEntry(File zip, String path, File destZip)
      Copies an existing ZIP file and removes entry with a given path.
      Parameters:
      zip - an existing ZIP file (only read)
      path - path of the entry to remove
      destZip - new ZIP file created.
      Since:
      1.7
    • removeEntry

      public static void removeEntry(File zip, String path)
      Changes an existing ZIP file: removes entry with a given path.
      Parameters:
      zip - an existing ZIP file
      path - path of the entry to remove
      Since:
      1.7
    • removeEntries

      public static void removeEntries(File zip, String[] paths, File destZip)
      Copies an existing ZIP file and removes entries with given paths.
      Parameters:
      zip - an existing ZIP file (only read)
      paths - paths of the entries to remove
      destZip - new ZIP file created.
      Since:
      1.7
    • removeEntries

      public static void removeEntries(File zip, String[] paths, OutputStream destOut)
      Copies an existing ZIP file and removes entries with given paths.
      Parameters:
      zip - an existing ZIP file (only read)
      paths - paths of the entries to remove
      destOut - new ZIP destination output stream
      Since:
      1.14
    • removeEntries

      public static void removeEntries(File zip, String[] paths)
      Changes an existing ZIP file: removes entries with given paths.
      Parameters:
      zip - an existing ZIP file
      paths - paths of the entries to remove
      Since:
      1.7
    • copyEntries

      private static void copyEntries(File zip, ZipOutputStream out)
      Copies all entries from one ZIP file to another.
      Parameters:
      zip - source ZIP file.
      out - target ZIP stream.
    • copyEntries

      private static void copyEntries(InputStream is, ZipOutputStream out)
      Copies all entries from one ZIP stream to another.
      Parameters:
      is - source stream (contains ZIP file).
      out - target ZIP stream.
    • copyEntries

      private static void copyEntries(File zip, ZipOutputStream out, Set<String> ignoredEntries)
      Copies all entries from one ZIP file to another, ignoring entries with path in ignoredEntries
      Parameters:
      zip - source ZIP file.
      out - target ZIP stream.
      ignoredEntries - paths of entries not to copy
    • filterDirEntries

      static Set<String> filterDirEntries(File zip, Collection<String> names)
      Parameters:
      zip - zip file to traverse
      names - names of entries to filter dirs from
      Returns:
      Set names of entries that are dirs.
    • replaceEntry

      public static boolean replaceEntry(File zip, String path, File file, File destZip)
      Copies an existing ZIP file and replaces a given entry in it.
      Parameters:
      zip - an existing ZIP file (only read).
      path - new ZIP entry path.
      file - new entry.
      destZip - new ZIP file created.
      Returns:
      true if the entry was replaced.
    • replaceEntry

      public static boolean replaceEntry(File zip, String path, File file)
      Changes an existing ZIP file: replaces a given entry in it.
      Parameters:
      zip - an existing ZIP file.
      path - new ZIP entry path.
      file - new entry.
      Returns:
      true if the entry was replaced.
    • replaceEntry

      public static boolean replaceEntry(File zip, String path, byte[] bytes, File destZip)
      Copies an existing ZIP file and replaces a given entry in it.
      Parameters:
      zip - an existing ZIP file (only read).
      path - new ZIP entry path.
      bytes - new entry bytes (or null if directory).
      destZip - new ZIP file created.
      Returns:
      true if the entry was replaced.
    • replaceEntry

      public static boolean replaceEntry(File zip, String path, byte[] bytes)
      Changes an existing ZIP file: replaces a given entry in it.
      Parameters:
      zip - an existing ZIP file.
      path - new ZIP entry path.
      bytes - new entry bytes (or null if directory).
      Returns:
      true if the entry was replaced.
    • replaceEntry

      public static boolean replaceEntry(File zip, String path, byte[] bytes, int compressionMethod)
      Changes an existing ZIP file: replaces a given entry in it.
      Parameters:
      zip - an existing ZIP file.
      path - new ZIP entry path.
      bytes - new entry bytes (or null if directory).
      compressionMethod - the new compression method (ZipEntry.STORED or ZipEntry.DEFLATED).
      Returns:
      true if the entry was replaced.
    • replaceEntry

      public static boolean replaceEntry(File zip, ZipEntrySource entry, File destZip)
      Copies an existing ZIP file and replaces a given entry in it.
      Parameters:
      zip - an existing ZIP file (only read).
      entry - new ZIP entry.
      destZip - new ZIP file created.
      Returns:
      true if the entry was replaced.
    • replaceEntry

      public static boolean replaceEntry(File zip, ZipEntrySource entry)
      Changes an existing ZIP file: replaces a given entry in it.
      Parameters:
      zip - an existing ZIP file.
      entry - new ZIP entry.
      Returns:
      true if the entry was replaced.
    • replaceEntries

      public static boolean replaceEntries(File zip, ZipEntrySource[] entries, File destZip)
      Copies an existing ZIP file and replaces the given entries in it.
      Parameters:
      zip - an existing ZIP file (only read).
      entries - new ZIP entries to be replaced with.
      destZip - new ZIP file created.
      Returns:
      true if at least one entry was replaced.
    • replaceEntries

      public static boolean replaceEntries(File zip, ZipEntrySource[] entries)
      Changes an existing ZIP file: replaces a given entry in it.
      Parameters:
      zip - an existing ZIP file.
      entries - new ZIP entries to be replaced with.
      Returns:
      true if at least one entry was replaced.
    • addOrReplaceEntries

      public static void addOrReplaceEntries(File zip, ZipEntrySource[] entries, File destZip)
      Copies an existing ZIP file and adds/replaces the given entries in it.
      Parameters:
      zip - an existing ZIP file (only read).
      entries - ZIP entries to be replaced or added.
      destZip - new ZIP file created.
    • addOrReplaceEntries

      public static void addOrReplaceEntries(File zip, ZipEntrySource[] entries)
      Changes a ZIP file: adds/replaces the given entries in it.
      Parameters:
      zip - an existing ZIP file (only read).
      entries - ZIP entries to be replaced or added.
    • entriesByPath

      static Map<String,ZipEntrySource> entriesByPath(ZipEntrySource... entries)
      Returns:
      given entries indexed by path.
    • transformEntry

      public static boolean transformEntry(File zip, String path, ZipEntryTransformer transformer, File destZip)
      Copies an existing ZIP file and transforms a given entry in it.
      Parameters:
      zip - an existing ZIP file (only read).
      path - new ZIP entry path.
      transformer - transformer for the given ZIP entry.
      destZip - new ZIP file created.
      Returns:
      true if the entry was replaced.
      Throws:
      IllegalArgumentException - if the destination is the same as the location
    • transformEntry

      public static boolean transformEntry(File zip, String path, ZipEntryTransformer transformer)
      Changes an existing ZIP file: transforms a given entry in it.
      Parameters:
      zip - an existing ZIP file (only read).
      path - new ZIP entry path.
      transformer - transformer for the given ZIP entry.
      Returns:
      true if the entry was replaced.
    • transformEntry

      public static boolean transformEntry(File zip, ZipEntryTransformerEntry entry, File destZip)
      Copies an existing ZIP file and transforms a given entry in it.
      Parameters:
      zip - an existing ZIP file (only read).
      entry - transformer for a ZIP entry.
      destZip - new ZIP file created.
      Returns:
      true if the entry was replaced.
    • transformEntry

      public static boolean transformEntry(File zip, ZipEntryTransformerEntry entry)
      Changes an existing ZIP file: transforms a given entry in it.
      Parameters:
      zip - an existing ZIP file (only read).
      entry - transformer for a ZIP entry.
      Returns:
      true if the entry was replaced.
    • transformEntries

      public static boolean transformEntries(File zip, ZipEntryTransformerEntry[] entries, File destZip)
      Copies an existing ZIP file and transforms the given entries in it.
      Parameters:
      zip - an existing ZIP file (only read).
      entries - ZIP entry transformers.
      destZip - new ZIP file created.
      Returns:
      true if at least one entry was replaced.
    • transformEntries

      public static boolean transformEntries(File zip, ZipEntryTransformerEntry[] entries)
      Changes an existing ZIP file: transforms a given entries in it.
      Parameters:
      zip - an existing ZIP file (only read).
      entries - ZIP entry transformers.
      Returns:
      true if the entry was replaced.
    • transformEntry

      public static boolean transformEntry(InputStream is, String path, ZipEntryTransformer transformer, OutputStream os)
      Copies an existing ZIP file and transforms a given entry in it.
      Parameters:
      is - a ZIP input stream.
      path - new ZIP entry path.
      transformer - transformer for the given ZIP entry.
      os - a ZIP output stream.
      Returns:
      true if the entry was replaced.
    • transformEntry

      public static boolean transformEntry(InputStream is, ZipEntryTransformerEntry entry, OutputStream os)
      Copies an existing ZIP file and transforms a given entry in it.
      Parameters:
      is - a ZIP input stream.
      entry - transformer for a ZIP entry.
      os - a ZIP output stream.
      Returns:
      true if the entry was replaced.
    • transformEntries

      public static boolean transformEntries(InputStream is, ZipEntryTransformerEntry[] entries, OutputStream os)
      Copies an existing ZIP file and transforms the given entries in it.
      Parameters:
      is - a ZIP input stream.
      entries - ZIP entry transformers.
      os - a ZIP output stream.
      Returns:
      true if at least one entry was replaced.
    • transformersByPath

      static Map<String,ZipEntryTransformer> transformersByPath(List<ZipEntryTransformerEntry> entries)
      Returns:
      transformers by path.
    • addEntry

      private static void addEntry(ZipEntrySource entry, ZipOutputStream out) throws IOException
      Adds a given ZIP entry to a ZIP file.
      Parameters:
      entry - new ZIP entry.
      out - target ZIP stream.
      Throws:
      IOException
    • archiveEquals

      public static boolean archiveEquals(File f1, File f2)
      Compares two ZIP files and returns true if they contain same entries.

      First the two files are compared byte-by-byte. If a difference is found the corresponding entries of both ZIP files are compared. Thus if same contents is packed differently the two archives may still be the same.

      Two archives are considered the same if

      1. they contain same number of entries,
      2. for each entry in the first archive there exists an entry with the same in the second archive
      3. for each entry in the first archive and the entry with the same name in the second archive
        1. both are either directories or files,
        2. both have the same size,
        3. both have the same CRC,
        4. both have the same contents (compared byte-by-byte).
      Parameters:
      f1 - first ZIP file.
      f2 - second ZIP file.
      Returns:
      true if the two ZIP files contain same entries, false if a difference was found or an error occurred during the comparison.
    • archiveEqualsInternal

      private static boolean archiveEqualsInternal(File f1, File f2) throws IOException
      Throws:
      IOException
    • metaDataEquals

      private static boolean metaDataEquals(String path, ZipEntry e1, ZipEntry e2) throws IOException
      Compares meta-data of two ZIP entries.

      Two entries are considered the same if

      1. both entries exist,
      2. both entries are either directories or files,
      3. both entries have the same size,
      4. both entries have the same CRC.
      Parameters:
      path - name of the entries.
      e1 - first entry (required).
      e2 - second entry (may be null).
      Returns:
      true if no difference was found.
      Throws:
      IOException
    • entryEquals

      public static boolean entryEquals(File f1, File f2, String path)
      Compares same entry in two ZIP files (byte-by-byte).
      Parameters:
      f1 - first ZIP file.
      f2 - second ZIP file.
      path - name of the entry.
      Returns:
      true if the contents of the entry was same in both ZIP files.
    • entryEquals

      public static boolean entryEquals(File f1, File f2, String path1, String path2)
      Compares two ZIP entries (byte-by-byte). .
      Parameters:
      f1 - first ZIP file.
      f2 - second ZIP file.
      path1 - name of the first entry.
      path2 - name of the second entry.
      Returns:
      true if the contents of the entries were same.
    • entryEquals

      public static boolean entryEquals(ZipFile zf1, ZipFile zf2, String path1, String path2)
      Compares two ZIP entries (byte-by-byte). .
      Parameters:
      zf1 - first ZIP file.
      zf2 - second ZIP file.
      path1 - name of the first entry.
      path2 - name of the second entry.
      Returns:
      true if the contents of the entries were same.
    • doEntryEquals

      private static boolean doEntryEquals(ZipFile zf1, ZipFile zf2, String path1, String path2) throws IOException
      Compares two ZIP entries (byte-by-byte). .
      Parameters:
      zf1 - first ZIP file.
      zf2 - second ZIP file.
      path1 - name of the first entry.
      path2 - name of the second entry.
      Returns:
      true if the contents of the entries were same.
      Throws:
      IOException
    • closeQuietly

      public static void closeQuietly(ZipFile zf)
      Closes the ZIP file while ignoring any errors.
      Parameters:
      zf - ZIP file to be closed.
    • operateInPlace

      private static boolean operateInPlace(File src, ZipUtil.InPlaceAction action)
      This method provides a general infrastructure for in-place operations. It creates temp file as a destination, then invokes the action on source and destination. Then it copies the result back into src file.
      Parameters:
      src - - source zip file we want to modify
      action - - action which actually modifies the archives
      Returns:
      result of the action