public class ZipOutputStream extends FilterOutputStream
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.
Modifier and Type | Class and Description |
---|---|
static class |
ZipOutputStream.UnicodeExtraFieldPolicy
enum that represents the possible policies for creating Unicode
extra fields.
|
Modifier and Type | Field and Description |
---|---|
protected byte[] |
buf
This buffer serves as a Deflater.
|
protected static byte[] |
CFH_SIG
central file header signature
|
protected static byte[] |
DD_SIG
data descriptor signature
|
protected java.util.zip.Deflater |
def
This Deflater object is used for output.
|
static int |
DEFAULT_COMPRESSION
Default compression level for deflated entries.
|
static int |
DEFLATED
Compression method for deflated entries.
|
protected static byte[] |
EOCD_SIG
end of central dir signature
|
protected static byte[] |
LFH_SIG
local file header signature
|
static int |
STORED
Compression method for stored entries.
|
out
Constructor and Description |
---|
ZipOutputStream(File file)
Creates a new ZIP OutputStream writing to a File.
|
ZipOutputStream(OutputStream out)
Creates a new ZIP OutputStream filtering the underlying stream.
|
Modifier and Type | Method and Description |
---|---|
boolean |
canWriteEntryData(ZipEntry ae)
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 |
closeEntry()
Writes all necessary data for this entry.
|
protected void |
deflate()
Writes next block of compressed data to the output stream.
|
void |
finish() |
void |
flush()
Flushes this output stream and forces any buffered output bytes
to be written out to the stream.
|
protected byte[] |
getBytes(String name)
Retrieve the bytes for the given String in the encoding set for
this Stream.
|
String |
getEncoding()
The encoding to use for filenames and the file comment.
|
boolean |
isSeekable()
This method indicates whether this archive is writing to a
seekable stream (i.e., to a random access file).
|
void |
putNextEntry(ZipEntry archiveEntry) |
void |
setComment(String comment)
Set the file comment.
|
void |
setCreateUnicodeExtraFields(ZipOutputStream.UnicodeExtraFieldPolicy b)
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.
|
void |
write(byte[] b,
int offset,
int length)
Writes bytes to ZIP entry.
|
protected void |
writeCentralDirectoryEnd()
Writes the "End of central dir record".
|
protected void |
writeCentralFileHeader(ZipEntry ze)
Writes the central file header entry.
|
protected void |
writeDataDescriptor(ZipEntry ze)
Writes the data descriptor entry.
|
protected void |
writeLocalFileHeader(ZipEntry ze)
Writes the local file header entry
|
protected void |
writeOut(byte[] data)
Write bytes to output or random access file.
|
protected void |
writeOut(byte[] data,
int offset,
int length)
Write bytes to output or random access file.
|
protected void |
writeZip64CentralDirectory()
Writes the "ZIP64 End of central dir record" and
"ZIP64 End of central dir locator".
|
write, write
protected byte[] buf
This attribute is only protected to provide a level of API
backwards compatibility. This class used to extend DeflaterOutputStream
up to
Revision 1.13.
protected static final byte[] CFH_SIG
protected static final byte[] DD_SIG
protected final java.util.zip.Deflater def
public static final int DEFAULT_COMPRESSION
public static final int DEFLATED
protected static final byte[] EOCD_SIG
protected static final byte[] LFH_SIG
public static final int STORED
public ZipOutputStream(File file) throws IOException
file
- the file to zip toIOException
- on errorpublic ZipOutputStream(OutputStream out)
out
- the outputstream to zippublic boolean canWriteEntryData(ZipEntry ae)
May return false if it is set up to use encryption or a compression method that hasn't been implemented yet.
public void close() throws IOException
close
in interface Closeable
close
in interface AutoCloseable
close
in class FilterOutputStream
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
and setUseZip64(org.apache.tools.zip.Zip64Mode)
is Zip64Mode.Never
.FilterOutputStream.flush()
,
FilterOutputStream.out
public void closeEntry() throws IOException
IOException
- on errorZip64RequiredException
- if the entry's uncompressed or
compressed size exceeds 4 GByte and setUseZip64(org.apache.tools.zip.Zip64Mode)
is Zip64Mode.Never
.protected final void deflate() throws IOException
IOException
- on errorpublic void finish() throws IOException
Zip64RequiredException
- if the archive's size exceeds 4
GByte or there are more than 65535 entries inside the archive
and setUseZip64(org.apache.tools.zip.Zip64Mode)
is Zip64Mode.Never
.IOException
public void flush() throws IOException
flush
in interface Flushable
flush
in class FilterOutputStream
IOException
- if an I/O error occurs.FilterOutputStream.out
protected byte[] getBytes(String name) throws java.util.zip.ZipException
name
- the string to get bytes fromjava.util.zip.ZipException
- on errorpublic String getEncoding()
public boolean isSeekable()
For seekable streams, you don't need to calculate the CRC or
uncompressed size for STORED
entries before
invoking putNextEntry(org.apache.tools.zip.ZipEntry)
.
public void putNextEntry(ZipEntry archiveEntry) throws IOException
Zip64RequiredException
- if the entry's uncompressed or
compressed size is known to exceed 4 GByte and setUseZip64(org.apache.tools.zip.Zip64Mode)
is Zip64Mode.Never
.IOException
public void setComment(String comment)
comment
- the commentpublic void setCreateUnicodeExtraFields(ZipOutputStream.UnicodeExtraFieldPolicy b)
Defaults to NEVER.
public void setEncoding(String encoding)
For a list of possible values see http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html. Defaults to the platform's default character encoding.
encoding
- the encoding valuepublic void setFallbackToUTF8(boolean b)
Defaults to false.
public void setLevel(int level)
Default is Deflater.DEFAULT_COMPRESSION.
level
- the compression level.IllegalArgumentException
- if an invalid compression
level is specified.public void setMethod(int method)
Default is DEFLATED.
method
- an int
from java.util.zip.ZipEntrypublic void setUseLanguageEncodingFlag(boolean b)
Defaults to true.
public void setUseZip64(Zip64Mode mode)
When setting the mode to Never
,
putNextEntry(org.apache.tools.zip.ZipEntry)
, closeEntry()
, finish()
or close()
may throw a Zip64RequiredException
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 the ZipEntry
is known
when calling putNextEntry(org.apache.tools.zip.ZipEntry)
or the archive is written
to a seekable output (i.e. you have used the File-arg constructor
) -
this mode is not valid when the output stream is not seekable
and the uncompressed size is unknown when putNextEntry(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 to Never
otherwise. Always
will create an archive that is at
least 24 bytes per entry bigger than the one Never
would create.
Defaults to AsNeeded
unless
putNextEntry(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 is Never
.
public void write(byte[] b, int offset, int length) throws IOException
write
in class FilterOutputStream
b
- the byte array to writeoffset
- the start position to write fromlength
- the number of bytes to writeIOException
- on errorFilterOutputStream.write(int)
protected void writeCentralDirectoryEnd() throws IOException
IOException
- on errorZip64RequiredException
- if the archive's size exceeds 4
GByte or there are more than 65535 entries inside the archive
and #setUseZip64
is Zip64Mode.Never
.protected void writeCentralFileHeader(ZipEntry ze) throws IOException
ze
- the entry to writeIOException
- on errorZip64RequiredException
- if the archive's size exceeds 4
GByte and #setUseZip64
is Zip64Mode.Never
.protected void writeDataDescriptor(ZipEntry ze) throws IOException
ze
- the entry to writeIOException
- on errorprotected void writeLocalFileHeader(ZipEntry ze) throws IOException
ze
- the entry to writeIOException
- on errorprotected final void writeOut(byte[] data) throws IOException
data
- the byte array to writeIOException
- on errorprotected final void writeOut(byte[] data, int offset, int length) throws IOException
data
- the byte array to writeoffset
- the start position to write fromlength
- the number of bytes to writeIOException
- on errorprotected void writeZip64CentralDirectory() throws IOException
IOException
- on error