Class ZipOutputStream
- All Implemented Interfaces:
Closeable
,Flushable
,AutoCloseable
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 RandomAccessFile
when you know that the output is going to go to a
file.
If RandomAccessFile 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 putNextEntry
can be called.
As of Apache Ant 1.9.0 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.tools.zip.Zip64Mode)
. If the stream can not
user RandomAccessFile and you try to write a ZipEntry of
unknown size then Zip64 extensions will be disabled by default.
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic final class
enum that represents the possible policies for creating Unicode extra fields. -
Field Summary
Modifier and TypeFieldDescriptionprotected byte[]
This buffer serves as a Deflater.protected static final byte[]
central file header signatureprotected static final byte[]
data descriptor signatureprotected 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 static final byte[]
end of central dir signatureprotected static final byte[]
local file header signaturestatic final int
Compression method for stored entries.Fields inherited from class java.io.FilterOutputStream
out
-
Constructor Summary
ConstructorDescriptionZipOutputStream
(File file) Creates a new ZIP OutputStream writing to a File.Creates a new ZIP OutputStream filtering the underlying stream. -
Method Summary
Modifier and TypeMethodDescriptionprotected static long
adjustToLong
(int i) Deprecated.use ZipUtil#adjustToLongboolean
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.protected final void
deflate()
Writes next block of compressed data to the output stream.void
finish()
Finish writing the archive.void
flush()
Flushes this output stream and forces any buffered output bytes to be written out to the stream.protected byte[]
Retrieve the bytes for the given String in the encoding set for this Stream.The encoding to use for filenames 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
putNextEntry
(ZipEntry archiveEntry) Put the specified entry into the archive.void
setComment
(String comment) Set the file comment.void
Whether to create Unicode Extra Fields.void
setEncoding
(String encoding) The encoding to use for filenames 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.protected static byte[]
toDosTime
(long t) Deprecated.use ZipUtil#toDosTimeprotected static ZipLong
Deprecated.use ZipUtil#toDosTimevoid
write
(byte[] b, int offset, int length) Writes bytes to ZIP entry.void
write
(int b) Writes a byte 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.protected void
Writes the "ZIP64 End of central dir record" and "ZIP64 End of central dir locator".Methods inherited from class java.io.FilterOutputStream
write
Methods inherited from class java.io.OutputStream
nullOutputStream
-
Field Details
-
DEFLATED
public static final int DEFLATEDCompression method for deflated entries.- Since:
- 1.1
- See Also:
-
DEFAULT_COMPRESSION
public static final int DEFAULT_COMPRESSIONDefault compression level for deflated entries.- Since:
- Ant 1.7
- See Also:
-
STORED
public static final int STOREDCompression method for stored entries.- Since:
- 1.1
- See Also:
-
EFS_FLAG
Deprecated.useGeneralPurposeBit.UFT8_NAMES_FLAG
insteadGeneral purpose flag, which indicates that filenames are written in utf-8.- See Also:
-
def
This Deflater object is used for output. -
buf
protected byte[] bufThis buffer serves as a Deflater.This attribute is only protected to provide a level of API backwards compatibility. This class used to extend
DeflaterOutputStream
up to Revision 1.13.- Since:
- 1.14
-
LFH_SIG
protected static final byte[] LFH_SIGlocal file header signature- Since:
- 1.1
-
DD_SIG
protected static final byte[] DD_SIGdata descriptor signature- Since:
- 1.1
-
CFH_SIG
protected static final byte[] CFH_SIGcentral file header signature- Since:
- 1.1
-
EOCD_SIG
protected static final byte[] EOCD_SIGend of central dir signature- Since:
- 1.1
-
-
Constructor Details
-
ZipOutputStream
Creates a new ZIP OutputStream filtering the underlying stream.- Parameters:
out
- the outputstream to zip- Since:
- 1.1
-
ZipOutputStream
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- Since:
- 1.14
-
-
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 invokingputNextEntry(org.apache.tools.zip.ZipEntry)
.- Returns:
- true if seekable
- Since:
- 1.17
-
setEncoding
The encoding to use for filenames and the file comment.For a list of possible values see https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html. Defaults to the platform's default character encoding.
- Parameters:
encoding
- the encoding value- Since:
- 1.3
-
getEncoding
The encoding to use for filenames and the file comment.- Returns:
- null if using the platform's default character encoding.
- Since:
- 1.3
-
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
- boolean
-
setCreateUnicodeExtraFields
Whether to create Unicode Extra Fields.Defaults to NEVER.
- Parameters:
b
- boolean
-
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
- boolean
-
setUseZip64
Whether Zip64 extensions will be used.When setting the mode to
Never
,putNextEntry(org.apache.tools.zip.ZipEntry)
,closeEntry()
,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 theZipEntry
is known when callingputNextEntry(org.apache.tools.zip.ZipEntry)
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 whenputNextEntry(org.apache.tools.zip.ZipEntry)
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
unlessputNextEntry(org.apache.tools.zip.ZipEntry)
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
- Zip64Mode- Since:
- 1.3
-
finish
Finish writing the archive.- Throws:
Zip64RequiredException
- if the archive's size exceeds 4 GByte or there are more than 65535 entries inside the archive andsetUseZip64(org.apache.tools.zip.Zip64Mode)
isZip64Mode.Never
.IOException
-
closeEntry
Writes all necessary data for this entry.- Throws:
IOException
- on errorZip64RequiredException
- if the entry's uncompressed or compressed size exceeds 4 GByte andsetUseZip64(org.apache.tools.zip.Zip64Mode)
isZip64Mode.Never
.- Since:
- 1.1
-
putNextEntry
Put the specified entry into the archive.- Throws:
Zip64RequiredException
- if the entry's uncompressed or compressed size is known to exceed 4 GByte andsetUseZip64(org.apache.tools.zip.Zip64Mode)
isZip64Mode.Never
.IOException
-
setComment
-
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.- Since:
- 1.1
-
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- Since:
- 1.1
-
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.
- Parameters:
ae
- ZipEntry- Returns:
- boolean
-
write
Writes a byte to ZIP entry.- Overrides:
write
in classFilterOutputStream
- Parameters:
b
- the byte to write- Throws:
IOException
- on error- Since:
- Ant 1.10.10
-
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
-
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 classFilterOutputStream
- 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.tools.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 classFilterOutputStream
- Throws:
IOException
- if an I/O error occurs.
-
deflate
Writes next block of compressed data to the output stream.- Throws:
IOException
- on error- Since:
- 1.14
-
writeLocalFileHeader
Writes the local file header entry- Parameters:
ze
- the entry to write- Throws:
IOException
- on error- Since:
- 1.1
-
writeDataDescriptor
Writes the data descriptor entry.- Parameters:
ze
- the entry to write- Throws:
IOException
- on error- Since:
- 1.1
-
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 and#setUseZip64
isZip64Mode.Never
.
-
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 and#setUseZip64
isZip64Mode.Never
.
-
toDosTime
Deprecated.use ZipUtil#toDosTimeConvert a Date object to a DOS date/time field.- Parameters:
time
- theDate
to convert- Returns:
- the date as a
ZipLong
- Since:
- 1.1
-
toDosTime
Deprecated.use ZipUtil#toDosTimeConvert a Date object to a DOS date/time field.Stolen from InfoZip's
fileio.c
- Parameters:
t
- number of milliseconds since the epoch- Returns:
- the date as a byte array
- Since:
- 1.26
-
getBytes
Retrieve the bytes for the given String in the encoding set for this Stream.- Parameters:
name
- the string to get bytes from- Returns:
- the bytes as a byte array
- Throws:
ZipException
- on error- Since:
- 1.3
-
writeZip64CentralDirectory
Writes the "ZIP64 End of central dir record" and "ZIP64 End of central dir locator".- Throws:
IOException
- on error
-
writeOut
Write bytes to output or random access file.- Parameters:
data
- the byte array to write- Throws:
IOException
- on error- Since:
- 1.14
-
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- Since:
- 1.14
-
adjustToLong
Deprecated.use ZipUtil#adjustToLongAssumes a negative integer really is a positive integer that has wrapped around and re-creates the original value.- Parameters:
i
- the value to treat as unsigned int.- Returns:
- the unsigned int as a long.
- Since:
- 1.34
-
GeneralPurposeBit.UFT8_NAMES_FLAG
instead