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 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 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 user RandomAccessFile 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
enum that represents the possible policies for creating Unicode extra fields.
|
| Modifier and Type | Field and Description |
|---|---|
protected 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.
|
static int |
EFS_FLAG
Deprecated.
use
GeneralPurposeBit instead
|
protected boolean |
finished
indicates if this archive is finished.
|
static int |
STORED
Compression method for stored entries.
|
| Constructor and Description |
|---|
ZipArchiveOutputStream(File
Creates a new ZIP OutputStream writing to a File.
|
ZipArchiveOutputStream(OutputStream
Creates a new ZIP OutputStream filtering the underlying stream.
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
canWriteEntryData(ArchiveEntry
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(File
Creates a new zip entry taking some information from the given file and using the provided name.
|
protected 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.
|
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
Writes the headers for an archive entry to the output stream.
|
void |
setComment(String
Set the file comment.
|
void |
setCreateUnicodeExtraFields(ZipArchiveOutputStream
Whether to create Unicode Extra Fields.
|
void |
setEncoding(String
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
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(ZipArchiveEntry
Writes the central file header entry.
|
protected void |
writeDataDescriptor(ZipArchiveEntry
Writes the data descriptor entry.
|
protected void |
writeLocalFileHeader(ZipArchiveEntry
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".
|
count, count, getBytesWritten, getCount, writewriteprotected boolean finished
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 instead
protected final Deflaterdef
public ZipArchiveOutputStream(OutputStreamout)
out - the outputstream to zip
public ZipArchiveOutputStream(Filefile) throws IOException
file - the file to zip to
IOException - on error
public 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(Stringencoding)
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 encoding
public StringgetEncoding()
public void setUseLanguageEncodingFlag(boolean b)
Defaults to true.
public void setCreateUnicodeExtraFields(ZipArchiveOutputStream.UnicodeExtraFieldPolicy b)
Defaults to NEVER.
public void setFallbackToUTF8(boolean b)
Defaults to false.
public void setUseZip64(Zip64Modemode)
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.
public void finish()
throws 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 .
IOException - if the user forgets to close the entry.
public void closeArchiveEntry()
throws IOException
closeArchiveEntry in class
ArchiveOutputStream
IOException - on error
Zip64RequiredException - 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 putArchiveEntry(ArchiveEntryarchiveEntry) throws IOException
ArchiveOutputStream.closeArchiveEntry() to complete the process.
putArchiveEntry in class
ArchiveOutputStream
archiveEntry - describes the entry
ClassCastException - if entry is not an instance of ZipArchiveEntry
Zip64RequiredException - 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 .
IOException -
public void setComment(Stringcomment)
comment - the comment
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.ZipEntry
public boolean canWriteEntryData(ArchiveEntryae)
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 test
public void write(byte[] b,
int offset,
int length)
throws IOException
write in class
OutputStream
b - the byte array to write
offset - the start position to write from
length - the number of bytes to write
IOException - on error
public void close()
throws IOException
close in interface
Closeable
close in interface
AutoCloseable
close in class
OutputStream
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 IOException
flush in interface
Flushable
flush in class
OutputStream
IOException - if an I/O error occurs.
protected final void deflate()
throws IOException
IOException - on error
protected void writeLocalFileHeader(ZipArchiveEntryze) throws IOException
ze - the entry to write
IOException - on error
protected void writeDataDescriptor(ZipArchiveEntryze) throws IOException
ze - the entry to write
IOException - on error
protected void writeCentralFileHeader(ZipArchiveEntryze) throws IOException
ze - the entry to write
IOException - on error
Zip64RequiredException - if the archive's size exceeds 4 GByte and
#setUseZip64 is
Zip64Mode.Never .
protected void writeCentralDirectoryEnd()
throws IOException
IOException - on error
Zip64RequiredException - 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 writeZip64CentralDirectory()
throws IOException
IOException - on error
protected final void writeOut(byte[] data)
throws IOException
data - the byte array to write
IOException - on error
protected final void writeOut(byte[] data,
int offset,
int length)
throws IOException
data - the byte array to write
offset - the start position to write from
length - the number of bytes to write
IOException - on error
public ArchiveEntrycreateArchiveEntry(File inputFile, String entryName) throws 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
IOException -