Class ZipArchiveOutputStream
- All Implemented Interfaces:
Closeable
,Flushable
,AutoCloseable
- Direct Known Subclasses:
JarArchiveOutputStream
java.util.zip.ZipOutputStream
to handle the extended functionality of this package, especially
internal/external file attributes and extra fields with different layouts for local file data and central directory entries.
This class will try to use SeekableByteChannel
when it knows that the output is going to go to a file and no split archive shall be
created.
If SeekableByteChannel cannot be used, this implementation will use a Data Descriptor to store size and CRC information for DEFLATED
entries, you don't need to calculate them yourself. Unfortunately, this is not possible for the STORED
method, where setting the CRC and
uncompressed size information is required before putArchiveEntry(ZipArchiveEntry)
can be called.
As of Apache Commons Compress 1.3, the class transparently supports Zip64 extensions and thus individual entries and archives larger than 4 GB or with more
than 65,536 entries in most cases but explicit control is provided via setUseZip64(org.apache.commons.compress.archivers.zip.Zip64Mode)
. If the stream can not use SeekableByteChannel and you try to
write a ZipArchiveEntry of unknown size, then Zip64 extensions will be disabled by default.
- This class is not thread-safe
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic final class
enum that represents the possible policies for creating Unicode extra fields. -
Field Summary
Modifier and TypeFieldDescriptionprotected final Deflater
This Deflater object is used for output.static final int
Default compression level for deflated entries.static final int
Compression method for deflated entries.static final int
Deprecated.protected boolean
Deprecated.SeeArchiveOutputStream.isFinished()
andfinish()
.static final int
Compression method for stored entries.Fields inherited from class java.io.FilterOutputStream
out
-
Constructor Summary
ConstructorDescriptionZipArchiveOutputStream
(File file) Creates a new ZIP OutputStream writing to a File.ZipArchiveOutputStream
(File file, long zipSplitSize) Creates a split ZIP Archive.Creates a new ZIP OutputStream filtering the underlying stream.Creates a new ZIP OutputStream writing to a SeekableByteChannel.ZipArchiveOutputStream
(Path path, long zipSplitSize) Creates a split ZIP Archive.ZipArchiveOutputStream
(Path file, OpenOption... options) Creates a new ZIP OutputStream writing to a Path. -
Method Summary
Modifier and TypeMethodDescriptionvoid
addRawArchiveEntry
(ZipArchiveEntry entry, InputStream rawStream) Adds an archive entry with a raw input stream.boolean
Whether this stream is able to write the given entry.void
close()
Closes this output stream and releases any system resources associated with the stream.void
Writes all necessary data for this entry.createArchiveEntry
(File inputFile, String entryName) Creates a new ZIP entry taking some information from the given file and using the provided name.createArchiveEntry
(Path inputPath, String entryName, LinkOption... options) Creates a new ZIP entry taking some information from the given file and using the provided name.protected final void
deflate()
Writes next block of compressed data to the output stream.void
finish()
Finishes the addition of entries to this stream, without closing it.void
flush()
Flushes this output stream and forces any buffered output bytes to be written out to the stream.long
Returns the total number of bytes written to this stream.The encoding to use for file names and the file comment.boolean
This method indicates whether this archive is writing to a seekable stream (i.e., to a random access file).void
putArchiveEntry
(ZipArchiveEntry archiveEntry) Writes the headers for an archive entry to the output stream.void
setComment
(String comment) Sets the file comment.void
Whether to create Unicode Extra Fields.void
setEncoding
(String encoding) The encoding to use for file names and the file comment.void
setFallbackToUTF8
(boolean b) Whether to fall back to UTF and the language encoding flag if the file name cannot be encoded using the specified encoding.void
setLevel
(int level) Sets the compression level for subsequent entries.void
setMethod
(int method) Sets the default compression method for subsequent entries.void
setUseLanguageEncodingFlag
(boolean b) Whether to set the language encoding flag if the file name encoding is UTF-8.void
setUseZip64
(Zip64Mode mode) Whether Zip64 extensions will be used.void
write
(byte[] b, int offset, int length) Writes bytes to ZIP entry.protected void
Writes the "End of central dir record".protected void
Writes the central file header entry.protected void
Writes the data descriptor entry.protected void
Writes the local file header entryprotected final void
writeOut
(byte[] data) Write bytes to output or random access file.protected final void
writeOut
(byte[] data, int offset, int length) Write bytes to output or random access file.void
writePreamble
(byte[] preamble) Write preamble data.void
writePreamble
(byte[] preamble, int offset, int length) Write preamble data.protected void
Writes the "ZIP64 End of central dir record" and "ZIP64 End of central dir locator".Methods inherited from class org.apache.commons.compress.archivers.ArchiveOutputStream
checkFinished, checkOpen, count, count, getCount, isClosed, isFinished, write
Methods inherited from class java.io.FilterOutputStream
write
-
Field Details
-
DEFLATED
Compression method for deflated entries.- See Also:
-
DEFAULT_COMPRESSION
Default compression level for deflated entries.- See Also:
-
STORED
Compression method for stored entries.- See Also:
-
EFS_FLAG
Deprecated.useGeneralPurposeBit.UFT8_NAMES_FLAG
insteadGeneral purpose flag, which indicates that file names are written in UTF-8.- See Also:
-
finished
Deprecated.SeeArchiveOutputStream.isFinished()
andfinish()
.Indicates if this archive is finished. protected for use in Jar implementation. -
def
This Deflater object is used for output.
-
-
Constructor Details
-
ZipArchiveOutputStream
Creates a new ZIP OutputStream writing to a File. Will use random access if possible.- Parameters:
file
- the file to ZIP to- Throws:
IOException
- on error
-
ZipArchiveOutputStream
Creates a split ZIP Archive.The files making up the archive will use Z01, Z02, ... extensions and the last part of it will be the given
file
.Even though the stream writes to a file this stream will behave as if no random access was possible. This means the sizes of stored entries need to be known before the actual entry data is written.
- Parameters:
file
- the file that will become the last part of the split archivezipSplitSize
- maximum size of a single part of the split archive created by this stream. Must be between 64kB and about 4GB.- Throws:
IOException
- on errorIllegalArgumentException
- if zipSplitSize is not in the required range- Since:
- 1.20
-
ZipArchiveOutputStream
Creates a new ZIP OutputStream filtering the underlying stream.- Parameters:
out
- the outputstream to zip
-
ZipArchiveOutputStream
Creates a split ZIP Archive.The files making up the archive will use Z01, Z02, ... extensions and the last part of it will be the given
file
.Even though the stream writes to a file this stream will behave as if no random access was possible. This means the sizes of stored entries need to be known before the actual entry data is written.
- Parameters:
path
- the path to the file that will become the last part of the split archivezipSplitSize
- maximum size of a single part of the split archive created by this stream. Must be between 64kB and about 4GB.- Throws:
IOException
- on errorIllegalArgumentException
- if zipSplitSize is not in the required range- Since:
- 1.22
-
ZipArchiveOutputStream
Creates a new ZIP OutputStream writing to a Path. Will use random access if possible.- Parameters:
file
- the file to ZIP tooptions
- options specifying how the file is opened.- Throws:
IOException
- on error- Since:
- 1.21
-
ZipArchiveOutputStream
Creates a new ZIP OutputStream writing to a SeekableByteChannel.SeekableInMemoryByteChannel
allows you to write to an in-memory archive using random access.- Parameters:
channel
- the channel to ZIP to- Since:
- 1.13
-
-
Method Details
-
addRawArchiveEntry
Adds an archive entry with a raw input stream.If crc, size and compressed size are supplied on the entry, these values will be used as-is. Zip64 status is re-established based on the settings in this stream, and the supplied value is ignored.
The entry is put and closed immediately.
- Parameters:
entry
- The archive entry to addrawStream
- The raw input stream of a different entry. May be compressed/encrypted.- Throws:
IOException
- If copying fails
-
canWriteEntryData
Whether this stream is able to write the given entry.May return false if it is set up to use encryption or a compression method that hasn't been implemented yet.
- Overrides:
canWriteEntryData
in classArchiveOutputStream<ZipArchiveEntry>
- Parameters:
ae
- the entry to test- Returns:
- This implementation always returns true.
- Since:
- 1.1
-
close
Closes this output stream and releases any system resources associated with the stream.- Specified by:
close
in interfaceAutoCloseable
- Specified by:
close
in interfaceCloseable
- Overrides:
close
in classArchiveOutputStream<ZipArchiveEntry>
- Throws:
IOException
- if an I/O error occurs.Zip64RequiredException
- if the archive's size exceeds 4 GByte or there are more than 65535 entries inside the archive andsetUseZip64(org.apache.commons.compress.archivers.zip.Zip64Mode)
isZip64Mode.Never
.
-
closeArchiveEntry
Writes all necessary data for this entry.- Specified by:
closeArchiveEntry
in classArchiveOutputStream<ZipArchiveEntry>
- Throws:
IOException
- on errorZip64RequiredException
- if the entry's uncompressed or compressed size exceeds 4 GByte andsetUseZip64(org.apache.commons.compress.archivers.zip.Zip64Mode)
isZip64Mode.Never
.
-
createArchiveEntry
Creates a new ZIP entry taking some information from the given file and using the provided name.The name will be adjusted to end with a forward slash "/" if the file is a directory. If the file is not a directory a potential trailing forward slash will be stripped from the entry name.
Must not be used if the stream has already been closed.
- Specified by:
createArchiveEntry
in classArchiveOutputStream<ZipArchiveEntry>
- Parameters:
inputFile
- the file to create the entry fromentryName
- name to use for the entry- Returns:
- the ArchiveEntry set up with details from the file
- Throws:
IOException
- if an I/O error occurs
-
createArchiveEntry
public ZipArchiveEntry createArchiveEntry(Path inputPath, String entryName, LinkOption... options) throws IOException Creates a new ZIP entry taking some information from the given file and using the provided name.The name will be adjusted to end with a forward slash "/" if the file is a directory. If the file is not a directory a potential trailing forward slash will be stripped from the entry name.
Must not be used if the stream has already been closed.
- Overrides:
createArchiveEntry
in classArchiveOutputStream<ZipArchiveEntry>
- Parameters:
inputPath
- path to create the entry from.entryName
- name of the entry.options
- options indicating how symbolic links are handled.- Returns:
- a new instance.
- Throws:
IOException
- if an I/O error occurs.- Since:
- 1.21
-
deflate
Writes next block of compressed data to the output stream.- Throws:
IOException
- on error
-
finish
Finishes the addition of entries to this stream, without closing it. Additional data can be written, if the format supports it.- Overrides:
finish
in classArchiveOutputStream<ZipArchiveEntry>
- Throws:
Zip64RequiredException
- if the archive's size exceeds 4 GByte or there are more than 65535 entries inside the archive andsetUseZip64(org.apache.commons.compress.archivers.zip.Zip64Mode)
isZip64Mode.Never
.IOException
- Maybe thrown by subclasses if the user forgets to close the entry.
-
flush
Flushes this output stream and forces any buffered output bytes to be written out to the stream.- Specified by:
flush
in interfaceFlushable
- Overrides:
flush
in classFilterOutputStream
- Throws:
IOException
- if an I/O error occurs.
-
getBytesWritten
Returns the total number of bytes written to this stream.- Overrides:
getBytesWritten
in classArchiveOutputStream<ZipArchiveEntry>
- Returns:
- the number of written bytes
- Since:
- 1.22
-
getEncoding
The encoding to use for file names and the file comment.- Returns:
- null if using the platform's default character encoding.
-
isSeekable
This method indicates whether this archive is writing to a seekable stream (i.e., to a random access file).For seekable streams, you don't need to calculate the CRC or uncompressed size for
STORED
entries before invokingputArchiveEntry(ZipArchiveEntry)
.- Returns:
- true if seekable
-
putArchiveEntry
Writes the headers for an archive entry to the output stream. The caller must then write the content to the stream and callArchiveOutputStream.closeArchiveEntry()
to complete the process.- Specified by:
putArchiveEntry
in classArchiveOutputStream<ZipArchiveEntry>
- Parameters:
archiveEntry
- describes the entry- Throws:
ClassCastException
- if entry is not an instance of ZipArchiveEntryZip64RequiredException
- if the entry's uncompressed or compressed size is known to exceed 4 GByte andsetUseZip64(org.apache.commons.compress.archivers.zip.Zip64Mode)
isZip64Mode.Never
.IOException
- if an I/O error occurs
-
setComment
Sets the file comment.- Parameters:
comment
- the comment
-
setCreateUnicodeExtraFields
Whether to create Unicode Extra Fields.Defaults to NEVER.
- Parameters:
b
- whether to create Unicode Extra Fields.
-
setEncoding
The encoding to use for file names and the file comment.For a list of possible values see Supported Encodings. Defaults to UTF-8.
- Parameters:
encoding
- the encoding to use for file names, use null for the platform's default encoding
-
setFallbackToUTF8
Whether to fall back to UTF and the language encoding flag if the file name cannot be encoded using the specified encoding.Defaults to false.
- Parameters:
b
- whether to fall back to UTF and the language encoding flag if the file name cannot be encoded using the specified encoding.
-
setLevel
Sets the compression level for subsequent entries.Default is Deflater.DEFAULT_COMPRESSION.
- Parameters:
level
- the compression level.- Throws:
IllegalArgumentException
- if an invalid compression level is specified.
-
setMethod
Sets the default compression method for subsequent entries.Default is DEFLATED.
- Parameters:
method
- anint
from java.util.zip.ZipEntry
-
setUseLanguageEncodingFlag
Whether to set the language encoding flag if the file name encoding is UTF-8.Defaults to true.
- Parameters:
b
- whether to set the language encoding flag if the file name encoding is UTF-8
-
setUseZip64
Whether Zip64 extensions will be used.When setting the mode to
Never
,putArchiveEntry(org.apache.commons.compress.archivers.zip.ZipArchiveEntry)
,closeArchiveEntry()
,finish()
orclose()
may throw aZip64RequiredException
if the entry's size or the total size of the archive exceeds 4GB or there are more than 65,536 entries inside the archive. Any archive created in this mode will be readable by implementations that don't support Zip64.When setting the mode to
Always
, Zip64 extensions will be used for all entries. Any archive created in this mode may be unreadable by implementations that don't support Zip64 even if all its contents would be.When setting the mode to
AsNeeded
, Zip64 extensions will transparently be used for those entries that require them. This mode can only be used if the uncompressed size of theZipArchiveEntry
is known when callingputArchiveEntry(org.apache.commons.compress.archivers.zip.ZipArchiveEntry)
or the archive is written to a seekable output (i.e. you have used theFile-arg constructor
) - this mode is not valid when the output stream is not seekable and the uncompressed size is unknown whenputArchiveEntry(org.apache.commons.compress.archivers.zip.ZipArchiveEntry)
is called.If no entry inside the resulting archive requires Zip64 extensions then
Never
will create the smallest archive.AsNeeded
will create a slightly bigger archive if the uncompressed size of any entry has initially been unknown and create an archive identical toNever
otherwise.Always
will create an archive that is at least 24 bytes per entry bigger than the oneNever
would create.Defaults to
AsNeeded
unlessputArchiveEntry(org.apache.commons.compress.archivers.zip.ZipArchiveEntry)
is called with an entry of unknown size and data is written to a non-seekable stream - in this case the default isNever
.- Parameters:
mode
- Whether Zip64 extensions will be used.- Since:
- 1.3
-
write
Writes bytes to ZIP entry.- Overrides:
write
in classFilterOutputStream
- Parameters:
b
- the byte array to writeoffset
- the start position to write fromlength
- the number of bytes to write- Throws:
IOException
- on error
-
writeCentralDirectoryEnd
Writes the "End of central dir record".- Throws:
IOException
- on errorZip64RequiredException
- if the archive's size exceeds 4 GByte or there are more than 65535 entries inside the archive andsetUseZip64(Zip64Mode)
isZip64Mode.Never
.
-
writeCentralFileHeader
Writes the central file header entry.- Parameters:
ze
- the entry to write- Throws:
IOException
- on errorZip64RequiredException
- if the archive's size exceeds 4 GByte andsetUseZip64(Zip64Mode)
isZip64Mode.Never
.
-
writeDataDescriptor
Writes the data descriptor entry.- Parameters:
ze
- the entry to write- Throws:
IOException
- on error
-
writeLocalFileHeader
Writes the local file header entry- Parameters:
ze
- the entry to write- Throws:
IOException
- on error
-
writeOut
Write bytes to output or random access file.- Parameters:
data
- the byte array to write- Throws:
IOException
- on error
-
writeOut
Write bytes to output or random access file.- Parameters:
data
- the byte array to writeoffset
- the start position to write fromlength
- the number of bytes to write- Throws:
IOException
- on error
-
writePreamble
Write preamble data. For most of the time, this is used to make self-extracting zips.- Parameters:
preamble
- data to write- Throws:
IOException
- if an entry already exists- Since:
- 1.21
-
writePreamble
Write preamble data. For most of the time, this is used to make self-extracting zips.- Parameters:
preamble
- data to writeoffset
- the start offset in the datalength
- the number of bytes to write- Throws:
IOException
- if an entry already exists- Since:
- 1.21
-
writeZip64CentralDirectory
Writes the "ZIP64 End of central dir record" and "ZIP64 End of central dir locator".- Throws:
IOException
- on error- Since:
- 1.3
-
GeneralPurposeBit.UFT8_NAMES_FLAG
instead