public class ZipArchiveOutputStream extends ArchiveOutputStream
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.
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.
Modifier and Type | Class and Description |
---|---|
static class |
ZipArchiveOutputStream.UnicodeExtraFieldPolicy
enum that represents the possible policies for creating Unicode
extra fields.
|
Modifier and Type | Field and Description |
---|---|
static int |
DEFAULT_COMPRESSION
Default compression level for deflated entries.
|
static int |
DEFLATED
Compression method for deflated entries.
|
static int |
EFS_FLAG
Deprecated.
use
GeneralPurposeBit.UFT8_NAMES_FLAG instead |
static int |
STORED
Compression method for stored entries.
|
Constructor and Description |
---|
ZipArchiveOutputStream(java.io.File file)
Creates a new ZIP OutputStream writing to a File.
|
ZipArchiveOutputStream(java.io.OutputStream out)
Creates a new ZIP OutputStream filtering the underlying stream.
|
ZipArchiveOutputStream(java.nio.channels.SeekableByteChannel channel)
Creates a new ZIP OutputStream writing to a SeekableByteChannel.
|
Modifier and Type | Method and Description |
---|---|
void |
addRawArchiveEntry(ZipArchiveEntry entry,
java.io.InputStream rawStream)
Adds an archive entry with a raw input stream.
|
boolean |
canWriteEntryData(ArchiveEntry 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 |
closeArchiveEntry()
Writes all necessary data for this entry.
|
ArchiveEntry |
createArchiveEntry(java.io.File inputFile,
java.lang.String entryName)
Creates a new zip entry taking some information from the given
file and using the provided name.
|
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.
|
java.lang.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 |
putArchiveEntry(ArchiveEntry archiveEntry)
Writes the headers for an archive entry to the output stream.
|
void |
setComment(java.lang.String comment)
Set the file comment.
|
void |
setCreateUnicodeExtraFields(ZipArchiveOutputStream.UnicodeExtraFieldPolicy b)
Whether to create Unicode Extra Fields.
|
void |
setEncoding(java.lang.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.
|
getBytesWritten, getCount, write
public static final int DEFLATED
public static final int DEFAULT_COMPRESSION
public static final int STORED
@Deprecated public static final int EFS_FLAG
GeneralPurposeBit.UFT8_NAMES_FLAG
insteadpublic ZipArchiveOutputStream(java.io.OutputStream out)
out
- the outputstream to zippublic ZipArchiveOutputStream(java.io.File file) throws java.io.IOException
file
- the file to zip tojava.io.IOException
- on errorpublic ZipArchiveOutputStream(java.nio.channels.SeekableByteChannel channel) throws java.io.IOException
SeekableInMemoryByteChannel
allows you to write to an in-memory archive using random
access.
channel
- the channel to zip tojava.io.IOException
- on errorpublic boolean isSeekable()
For seekable streams, you don't need to calculate the CRC or
uncompressed size for STORED
entries before
invoking putArchiveEntry(ArchiveEntry)
.
public void setEncoding(java.lang.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 UTF-8.
encoding
- the encoding to use for file names, use null
for the platform's default encodingpublic java.lang.String getEncoding()
public void setUseLanguageEncodingFlag(boolean b)
Defaults to true.
b
- whether to set the language encoding flag if the file
name encoding is UTF-8public void setCreateUnicodeExtraFields(ZipArchiveOutputStream.UnicodeExtraFieldPolicy b)
Defaults to NEVER.
b
- whether to create Unicode Extra Fields.public void setFallbackToUTF8(boolean b)
Defaults to false.
b
- whether to fall back to UTF and the language encoding
flag if the file name cannot be encoded using the specified
encoding.public void setUseZip64(Zip64Mode mode)
When setting the mode to Never
,
putArchiveEntry(org.apache.commons.compress.archivers.ArchiveEntry)
, closeArchiveEntry()
, 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 ZipArchiveEntry
is known
when calling putArchiveEntry(org.apache.commons.compress.archivers.ArchiveEntry)
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 putArchiveEntry(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 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
putArchiveEntry(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 is Never
.
mode
- Whether Zip64 extensions will be used.public void finish() throws java.io.IOException
finish
in class ArchiveOutputStream
Zip64RequiredException
- if the archive's size exceeds 4
GByte or there are more than 65535 entries inside the archive
and setUseZip64(org.apache.commons.compress.archivers.zip.Zip64Mode)
is Zip64Mode.Never
.java.io.IOException
- if the user forgets to close the entry.public void closeArchiveEntry() throws java.io.IOException
closeArchiveEntry
in class ArchiveOutputStream
java.io.IOException
- on errorZip64RequiredException
- if the entry's uncompressed or
compressed size exceeds 4 GByte and setUseZip64(org.apache.commons.compress.archivers.zip.Zip64Mode)
is Zip64Mode.Never
.public void addRawArchiveEntry(ZipArchiveEntry entry, java.io.InputStream rawStream) throws java.io.IOException
entry
- The archive entry to addrawStream
- The raw input stream of a different entry. May be compressed/encrypted.java.io.IOException
- If copying failspublic void putArchiveEntry(ArchiveEntry archiveEntry) throws java.io.IOException
ArchiveOutputStream.closeArchiveEntry()
to complete the process.putArchiveEntry
in class ArchiveOutputStream
archiveEntry
- describes the entryjava.lang.ClassCastException
- if entry is not an instance of ZipArchiveEntryZip64RequiredException
- if the entry's uncompressed or
compressed size is known to exceed 4 GByte and setUseZip64(org.apache.commons.compress.archivers.zip.Zip64Mode)
is Zip64Mode.Never
.java.io.IOException
- if an I/O error occurspublic void setComment(java.lang.String comment)
comment
- the commentpublic void setLevel(int level)
Default is Deflater.DEFAULT_COMPRESSION.
level
- the compression level.java.lang.IllegalArgumentException
- if an invalid compression
level is specified.public void setMethod(int method)
Default is DEFLATED.
method
- an int
from java.util.zip.ZipEntrypublic boolean canWriteEntryData(ArchiveEntry ae)
May return false if it is set up to use encryption or a compression method that hasn't been implemented yet.
canWriteEntryData
in class ArchiveOutputStream
ae
- the entry to testpublic void write(byte[] b, int offset, int length) throws java.io.IOException
write
in class java.io.OutputStream
b
- the byte array to writeoffset
- the start position to write fromlength
- the number of bytes to writejava.io.IOException
- on errorpublic void close() throws java.io.IOException
close
in interface java.io.Closeable
close
in interface java.lang.AutoCloseable
close
in class java.io.OutputStream
java.io.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.commons.compress.archivers.zip.Zip64Mode)
is Zip64Mode.Never
.public void flush() throws java.io.IOException
flush
in interface java.io.Flushable
flush
in class java.io.OutputStream
java.io.IOException
- if an I/O error occurs.public ArchiveEntry createArchiveEntry(java.io.File inputFile, java.lang.String entryName) throws java.io.IOException
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.
createArchiveEntry
in class ArchiveOutputStream
inputFile
- the file to create the entry fromentryName
- name to use for the entryjava.io.IOException
- if an I/O error occurs"Copyright © 2010 - 2020 Adobe Systems Incorporated. All Rights Reserved"