Class ZipArchiveOutputStream
- All Implemented Interfaces:
Closeable
,Flushable
,AutoCloseable
- Direct Known Subclasses:
JarArchiveOutputStream
java.util.zip.ZipOutputStream
that does 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, this means, you don't need to
calculate them yourself. Unfortunately this is not possible for
the STORED
method, here setting the CRC and
uncompressed size information is required before putArchiveEntry(ArchiveEntry)
can be called.
As of Apache Commons Compress 1.3 it transparently supports Zip64
extensions and thus individual entries and archives larger than 4
GB or with more than 65536 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.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static final class
Structure collecting information for the entry that is currently being written.private static final class
static final class
enum that represents the possible policies for creating Unicode extra fields. -
Field Summary
FieldsModifier and TypeFieldDescription(package private) static final int
private final Calendar
private long
Disk number start of central directory.private long
Length of central directory.private long
Start of central directory.private static final int
private static final int
private static final int
private static final int
private static final int
private static final int
private static final int
private static final int
private static final int
private static final int
private static final int
private static final int
private static final int
(package private) static final byte[]
central file header signatureprivate static final int
private static final int
private static final int
private static final int
private final SeekableByteChannel
Optional random access output.private String
The file comment.private final byte[]
whether to create UnicodePathExtraField-s for each entry.(package private) static final byte[]
data descriptor signatureprotected final Deflater
This Deflater object is used for output.static final int
Default compression level for deflated entries.(package private) static final String
default encoding for file names and comment.static final int
Compression method for deflated entries.static final int
Deprecated.private String
The encoding to use for file names and the file comment.private final List<ZipArchiveEntry>
List of ZipArchiveEntries written so far.Current entry.(package private) static final byte[]
end of central dir signatureprivate long
Length of end of central directoryprivate boolean
Whether to encode non-encodable file names as UTF-8.protected boolean
indicates if this archive is finished.private boolean
Has the compression level changed when compared to the last entry?private boolean
Whether anything inside this archive has used a ZIP64 feature.private final boolean
Whether we are creating a split zipprivate int
Compression level for next entry.private static final int
private static final int
private static final int
private static final int
private static final int
private static final int
private static final int
private static final int
(package private) static final byte[]
local file header signatureprivate static final int
private static final int
private static final int
private static final byte[]
Helper, a 0 as ZipLong.private final Map<ZipArchiveEntry,
ZipArchiveOutputStream.EntryMetaData> Holds some book-keeping data for each entry.private int
Default compression method for next entry.Holds the number of Central Directories on each disk, this is used when writing Zip64 End Of Central Directory and End Of Central Directoryprivate static final byte[]
private final OutputStream
static final int
Compression method for stored entries.private final StreamCompressor
private boolean
whether to use the general purpose bit flag when writing UTF-8 file names or not.private static final byte[]
Helper, a 0 as ZipShort.(package private) static final byte[]
ZIP64 end of central dir locator signature(package private) static final byte[]
ZIP64 end of central dir signatureprivate Zip64Mode
private ZipEncoding
The zip encoding to use for file names and the file comment. -
Constructor Summary
ConstructorsConstructorDescriptionZipArchiveOutputStream
(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 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.private void
addUnicodeExtraFields
(ZipArchiveEntry ze, boolean encodable, ByteBuffer name) Adds UnicodeExtra fields for name and file comment if mode is ALWAYS or the data cannot be encoded using the configured encoding.boolean
Whether this stream is able to write the given entry.private boolean
checkIfNeedsZip64
(Zip64Mode effectiveMode) Verifies the sizes aren't too big in the Zip64Mode.Never case and returns whether the entry would require a Zip64 extra field.void
close()
Closes this output stream and releases any system resources associated with the stream.void
Writes all necessary data for this entry.private void
closeCopiedEntry
(boolean phased) Writes all necessary data for this entry.private void
closeEntry
(boolean actuallyNeedsZip64, boolean phased) private void
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.private byte[]
private byte[]
createCentralFileHeader
(ZipArchiveEntry ze, ByteBuffer name, ZipArchiveOutputStream.EntryMetaData entryMetaData, boolean needsZip64Extra) Writes the central file header entry.private byte[]
createLocalFileHeader
(ZipArchiveEntry ze, ByteBuffer name, boolean encodable, boolean phased, long archiveOffset) protected final void
deflate()
Writes next block of compressed data to the output stream.(package private) void
destroy()
Closes the underlying stream/file without finishing the archive, the result will likely be a corrupt archive.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.private void
Ensures all bytes sent to the deflater are written to the stream.private Zip64Mode
If the mode is AsNeeded and the entry is a compressed entry of unknown size that gets written to a non-seekable stream then change the default to Never.The encoding to use for file names and the file comment.private ZipEncoding
private GeneralPurposeBit
getGeneralPurposeBits
(boolean utfFallback, boolean usesDataDescriptor) private ByteBuffer
Get the existing ZIP64 extended information extra field or create a new one and add it to the entry.private boolean
handleSizesAndCrc
(long bytesWritten, long crc, Zip64Mode effectiveMode) Ensures the current entry's size and CRC information is set to the values just written, verifies it isn't too big in the Zip64Mode.Never case and returns whether the entry would require a Zip64 extra field.private void
handleZip64Extra
(ZipArchiveEntry ze, long lfhOffset, boolean needsZip64Extra) If the entry needs Zip64 extra information inside the central directory then configure its data.private boolean
Is there a ZIP64 extended information extra field for the entry?boolean
This method indicates whether this archive is writing to a seekable stream (i.e., to a random access file).private boolean
isTooLargeForZip32
(ZipArchiveEntry zipArchiveEntry) private boolean
isZip64Required
(ZipArchiveEntry entry1, Zip64Mode requestedMode) private void
preClose()
void
putArchiveEntry
(ArchiveEntry archiveEntry) Writes the headers for an archive entry to the output stream.private void
putArchiveEntry
(ArchiveEntry archiveEntry, boolean phased) Writes the headers for an archive entry to the output stream.private void
rewriteSizesAndCrc
(boolean actuallyNeedsZip64) When using random access output, write the local file header and potentially the ZIP64 extra containing the correct CRC and compressed/uncompressed sizes.void
setComment
(String comment) Set the file comment.void
Whether to create Unicode Extra Fields.private void
setDefaults
(ZipArchiveEntry entry) Provides default values for compression method and last modification time.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.private boolean
shouldAddZip64Extra
(ZipArchiveEntry entry, Zip64Mode mode) Whether to add a Zip64 extended information extra field to the local file header.private boolean
4.4.1.4 If one of the fields in the end of central directory record is too small to hold required data, the field SHOULD be set to -1 (0xFFFF or 0xFFFFFFFF) and the ZIP64 format record SHOULD be created.private boolean
usesDataDescriptor
(int zipMethod, boolean phased) private void
If the Zip64 mode is set to never, then all the data in End Of Central Directory should not exceed their limits.private void
validateSizeInformation
(Zip64Mode effectiveMode) Throws an exception if the size is unknown for a stored entry that is written to a non-seekable output or the entry is too big to be written without Zip64 extra but the mode has been set to Never.private int
versionNeededToExtract
(int zipMethod, boolean zip64, boolean usedDataDescriptor) private int
versionNeededToExtractMethod
(int zipMethod) void
write
(byte[] b, int offset, int length) Writes bytes to ZIP entry.protected void
Writes the "End of central dir record".private void
protected void
Writes the central file header entry.private void
writeCounted
(byte[] data) Write bytes to output or random access file.protected void
Writes the data descriptor entry.protected void
Writes the local file header entryprivate void
writeLocalFileHeader
(ZipArchiveEntry ze, boolean phased) protected 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
count, count, getBytesWritten, getCount, write
Methods inherited from class java.io.OutputStream
write
-
Field Details
-
BUFFER_SIZE
static final int BUFFER_SIZE- See Also:
-
LFH_SIG_OFFSET
private static final int LFH_SIG_OFFSET- See Also:
-
LFH_VERSION_NEEDED_OFFSET
private static final int LFH_VERSION_NEEDED_OFFSET- See Also:
-
LFH_GPB_OFFSET
private static final int LFH_GPB_OFFSET- See Also:
-
LFH_METHOD_OFFSET
private static final int LFH_METHOD_OFFSET- See Also:
-
LFH_TIME_OFFSET
private static final int LFH_TIME_OFFSET- See Also:
-
LFH_CRC_OFFSET
private static final int LFH_CRC_OFFSET- See Also:
-
LFH_COMPRESSED_SIZE_OFFSET
private static final int LFH_COMPRESSED_SIZE_OFFSET- See Also:
-
LFH_ORIGINAL_SIZE_OFFSET
private static final int LFH_ORIGINAL_SIZE_OFFSET- See Also:
-
LFH_FILENAME_LENGTH_OFFSET
private static final int LFH_FILENAME_LENGTH_OFFSET- See Also:
-
LFH_EXTRA_LENGTH_OFFSET
private static final int LFH_EXTRA_LENGTH_OFFSET- See Also:
-
LFH_FILENAME_OFFSET
private static final int LFH_FILENAME_OFFSET- See Also:
-
CFH_SIG_OFFSET
private static final int CFH_SIG_OFFSET- See Also:
-
CFH_VERSION_MADE_BY_OFFSET
private static final int CFH_VERSION_MADE_BY_OFFSET- See Also:
-
CFH_VERSION_NEEDED_OFFSET
private static final int CFH_VERSION_NEEDED_OFFSET- See Also:
-
CFH_GPB_OFFSET
private static final int CFH_GPB_OFFSET- See Also:
-
CFH_METHOD_OFFSET
private static final int CFH_METHOD_OFFSET- See Also:
-
CFH_TIME_OFFSET
private static final int CFH_TIME_OFFSET- See Also:
-
CFH_CRC_OFFSET
private static final int CFH_CRC_OFFSET- See Also:
-
CFH_COMPRESSED_SIZE_OFFSET
private static final int CFH_COMPRESSED_SIZE_OFFSET- See Also:
-
CFH_ORIGINAL_SIZE_OFFSET
private static final int CFH_ORIGINAL_SIZE_OFFSET- See Also:
-
CFH_FILENAME_LENGTH_OFFSET
private static final int CFH_FILENAME_LENGTH_OFFSET- See Also:
-
CFH_EXTRA_LENGTH_OFFSET
private static final int CFH_EXTRA_LENGTH_OFFSET- See Also:
-
CFH_COMMENT_LENGTH_OFFSET
private static final int CFH_COMMENT_LENGTH_OFFSET- See Also:
-
CFH_DISK_NUMBER_OFFSET
private static final int CFH_DISK_NUMBER_OFFSET- See Also:
-
CFH_INTERNAL_ATTRIBUTES_OFFSET
private static final int CFH_INTERNAL_ATTRIBUTES_OFFSET- See Also:
-
CFH_EXTERNAL_ATTRIBUTES_OFFSET
private static final int CFH_EXTERNAL_ATTRIBUTES_OFFSET- See Also:
-
CFH_LFH_OFFSET
private static final int CFH_LFH_OFFSET- See Also:
-
CFH_FILENAME_OFFSET
private static final int CFH_FILENAME_OFFSET- See Also:
-
finished
protected boolean finishedindicates if this archive is finished. protected for use in Jar implementation -
DEFLATED
public static final int DEFLATEDCompression method for deflated entries.- See Also:
-
DEFAULT_COMPRESSION
public static final int DEFAULT_COMPRESSIONDefault compression level for deflated entries.- See Also:
-
STORED
public static final int STOREDCompression method for stored entries.- See Also:
-
DEFAULT_ENCODING
default encoding for file names and comment.- See Also:
-
EFS_FLAG
Deprecated.useGeneralPurposeBit.UFT8_NAMES_FLAG
insteadGeneral purpose flag, which indicates that file names are written in UTF-8.- See Also:
-
entry
Current entry. -
comment
The file comment. -
level
private int levelCompression level for next entry. -
hasCompressionLevelChanged
private boolean hasCompressionLevelChangedHas the compression level changed when compared to the last entry? -
method
private int methodDefault compression method for next entry. -
entries
List of ZipArchiveEntries written so far. -
streamCompressor
-
cdOffset
private long cdOffsetStart of central directory. -
cdLength
private long cdLengthLength of central directory. -
cdDiskNumberStart
private long cdDiskNumberStartDisk number start of central directory. -
eocdLength
private long eocdLengthLength of end of central directory -
ZERO
private static final byte[] ZEROHelper, a 0 as ZipShort. -
LZERO
private static final byte[] LZEROHelper, a 0 as ZipLong. -
ONE
private static final byte[] ONE -
metaData
Holds some book-keeping data for each entry. -
encoding
The encoding to use for file names and the file comment.For a list of possible values see http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html. Defaults to UTF-8.
-
zipEncoding
The zip encoding to use for file names and the file comment. This field is of internal use and will be set insetEncoding(String)
. -
def
This Deflater object is used for output. -
channel
Optional random access output. -
out
-
useUTF8Flag
private boolean useUTF8Flagwhether to use the general purpose bit flag when writing UTF-8 file names or not. -
fallbackToUTF8
private boolean fallbackToUTF8Whether to encode non-encodable file names as UTF-8. -
createUnicodeExtraFields
whether to create UnicodePathExtraField-s for each entry. -
hasUsedZip64
private boolean hasUsedZip64Whether anything inside this archive has used a ZIP64 feature.- Since:
- 1.3
-
zip64Mode
-
copyBuffer
private final byte[] copyBuffer -
calendarInstance
-
isSplitZip
private final boolean isSplitZipWhether we are creating a split zip -
numberOfCDInDiskData
Holds the number of Central Directories on each disk, this is used when writing Zip64 End Of Central Directory and End Of Central Directory -
LFH_SIG
static final byte[] LFH_SIGlocal file header signature -
DD_SIG
static final byte[] DD_SIGdata descriptor signature -
CFH_SIG
static final byte[] CFH_SIGcentral file header signature -
EOCD_SIG
static final byte[] EOCD_SIGend of central dir signature -
ZIP64_EOCD_SIG
static final byte[] ZIP64_EOCD_SIGZIP64 end of central dir signature -
ZIP64_EOCD_LOC_SIG
static final byte[] ZIP64_EOCD_LOC_SIGZIP64 end of central dir locator signature
-
-
Constructor Details
-
ZipArchiveOutputStream
Creates a new ZIP OutputStream filtering the underlying stream.- Parameters:
out
- the outputstream to zip
-
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 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 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 writing to a SeekableByteChannel.SeekableInMemoryByteChannel
allows you to write to an in-memory archive using random access.- Parameters:
channel
- the channel to zip to- Throws:
IOException
- on error- Since:
- 1.13
-
-
Method Details
-
isSeekable
public boolean 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(ArchiveEntry)
.- Returns:
- true if seekable
-
setEncoding
The encoding to use for file names and the file comment.For a list of possible values see http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html. Defaults to UTF-8.
- Parameters:
encoding
- the encoding to use for file names, use null for the platform's default encoding
-
getEncoding
The encoding to use for file names and the file comment.- Returns:
- null if using the platform's default character encoding.
-
setUseLanguageEncodingFlag
public void setUseLanguageEncodingFlag(boolean b) 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
-
setCreateUnicodeExtraFields
Whether to create Unicode Extra Fields.Defaults to NEVER.
- Parameters:
b
- whether to create Unicode Extra Fields.
-
setFallbackToUTF8
public 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.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.
-
setUseZip64
Whether Zip64 extensions will be used.When setting the mode to
Never
,putArchiveEntry(org.apache.commons.compress.archivers.ArchiveEntry)
,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 65536 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.ArchiveEntry)
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.ArchiveEntry)
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.ArchiveEntry)
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
-
finish
Finishes the addition of entries to this stream, without closing it. Additional data can be written, if the format supports it.- Specified by:
finish
in classArchiveOutputStream
- 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
- if the user forgets to close the entry.
-
writeCentralDirectoryInChunks
- Throws:
IOException
-
closeArchiveEntry
Writes all necessary data for this entry.- Specified by:
closeArchiveEntry
in classArchiveOutputStream
- 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
.
-
closeCopiedEntry
Writes all necessary data for this entry.- Parameters:
phased
- This entry is second phase of a 2-phase zip creation, size, compressed size and crc are known in 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
.
-
closeEntry
- Throws:
IOException
-
preClose
- Throws:
IOException
-
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
-
flushDeflater
Ensures all bytes sent to the deflater are written to the stream.- Throws:
IOException
-
handleSizesAndCrc
private boolean handleSizesAndCrc(long bytesWritten, long crc, Zip64Mode effectiveMode) throws ZipException Ensures the current entry's size and CRC information is set to the values just written, verifies it isn't too big in the Zip64Mode.Never case and returns whether the entry would require a Zip64 extra field.- Throws:
ZipException
-
checkIfNeedsZip64
Verifies the sizes aren't too big in the Zip64Mode.Never case and returns whether the entry would require a Zip64 extra field.- Throws:
ZipException
-
isZip64Required
-
isTooLargeForZip32
-
rewriteSizesAndCrc
When using random access output, write the local file header and potentially the ZIP64 extra containing the correct CRC and compressed/uncompressed sizes.- Throws:
IOException
-
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
- 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
-
putArchiveEntry
Writes the headers for an archive entry to the output stream. The caller must then write the content to the stream and callcloseArchiveEntry()
to complete the process.- Parameters:
archiveEntry
- The archiveEntryphased
- If true size, compressedSize and crc required to be known up-front in the archiveEntry- 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
-
setDefaults
Provides default values for compression method and last modification time. -
validateSizeInformation
Throws an exception if the size is unknown for a stored entry that is written to a non-seekable output or the entry is too big to be written without Zip64 extra but the mode has been set to Never.- Throws:
ZipException
-
shouldAddZip64Extra
Whether to add a Zip64 extended information extra field to the local file header.Returns true if
- mode is Always
- or we already know it is going to be needed
- or the size is unknown and we can ensure it won't hurt other implementations if we add it (i.e. we can erase its usage
-
setComment
Set the file comment.- Parameters:
comment
- the comment
-
setLevel
public void setLevel(int level) 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
public void setMethod(int method) Sets the default compression method for subsequent entries.Default is DEFLATED.
- Parameters:
method
- anint
from java.util.zip.ZipEntry
-
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
- Parameters:
ae
- the entry to test- Returns:
- This implementation always returns true.
- Since:
- 1.1
-
writePreamble
Write preamble data. For most of 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 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
-
write
Writes bytes to ZIP entry.- Overrides:
write
in classOutputStream
- Parameters:
b
- the byte array to writeoffset
- the start position to write fromlength
- the number of bytes to write- Throws:
IOException
- on error
-
writeCounted
Write bytes to output or random access file.- Parameters:
data
- the byte array to write- Throws:
IOException
- on error
-
copyFromZipInputStream
- Throws:
IOException
-
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 classOutputStream
- 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
.
-
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 classOutputStream
- Throws:
IOException
- if an I/O error occurs.
-
deflate
Writes next block of compressed data to the output stream.- Throws:
IOException
- on error
-
writeLocalFileHeader
Writes the local file header entry- Parameters:
ze
- the entry to write- Throws:
IOException
- on error
-
writeLocalFileHeader
- Throws:
IOException
-
createLocalFileHeader
private byte[] createLocalFileHeader(ZipArchiveEntry ze, ByteBuffer name, boolean encodable, boolean phased, long archiveOffset) -
addUnicodeExtraFields
private void addUnicodeExtraFields(ZipArchiveEntry ze, boolean encodable, ByteBuffer name) throws IOException Adds UnicodeExtra fields for name and file comment if mode is ALWAYS or the data cannot be encoded using the configured encoding.- Throws:
IOException
-
writeDataDescriptor
Writes the data descriptor entry.- Parameters:
ze
- the entry to write- Throws:
IOException
- on error
-
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
.
-
createCentralFileHeader
- Throws:
IOException
-
createCentralFileHeader
private byte[] createCentralFileHeader(ZipArchiveEntry ze, ByteBuffer name, ZipArchiveOutputStream.EntryMetaData entryMetaData, boolean needsZip64Extra) throws IOException Writes the central file header entry.- Parameters:
ze
- the entry to writename
- The encoded nameentryMetaData
- meta data for this file- Throws:
IOException
- on error
-
handleZip64Extra
If the entry needs Zip64 extra information inside the central directory then configure its data. -
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
.
-
validateIfZip64IsNeededInEOCD
If the Zip64 mode is set to never, then all the data in End Of Central Directory should not exceed their limits.- Throws:
Zip64RequiredException
- if Zip64 is actually needed
-
writeZip64CentralDirectory
Writes the "ZIP64 End of central dir record" and "ZIP64 End of central dir locator".- Throws:
IOException
- on error- Since:
- 1.3
-
shouldUseZip64EOCD
private boolean shouldUseZip64EOCD()4.4.1.4 If one of the fields in the end of central directory record is too small to hold required data, the field SHOULD be set to -1 (0xFFFF or 0xFFFFFFFF) and the ZIP64 format record SHOULD be created.- Returns:
- true if zip64 End Of Central Directory is needed
-
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
-
getGeneralPurposeBits
-
versionNeededToExtract
private int versionNeededToExtract(int zipMethod, boolean zip64, boolean usedDataDescriptor) -
usesDataDescriptor
private boolean usesDataDescriptor(int zipMethod, boolean phased) -
versionNeededToExtractMethod
private int versionNeededToExtractMethod(int zipMethod) -
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
- 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 ArchiveEntry 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
- 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
-
getZip64Extra
Get the existing ZIP64 extended information extra field or create a new one and add it to the entry.- Since:
- 1.3
-
hasZip64Extra
Is there a ZIP64 extended information extra field for the entry?- Since:
- 1.3
-
getEffectiveZip64Mode
If the mode is AsNeeded and the entry is a compressed entry of unknown size that gets written to a non-seekable stream then change the default to Never.- Since:
- 1.3
-
getEntryEncoding
-
getName
- Throws:
IOException
-
destroy
Closes the underlying stream/file without finishing the archive, the result will likely be a corrupt archive.This method only exists to support tests that generate corrupt archives so they can clean up any temporary files.
- Throws:
IOException
-
GeneralPurposeBit.UFT8_NAMES_FLAG
instead