public class ZipArchiveOutputStream extends ArchiveOutputStream<ZipArchiveEntry>
java.util.zip.ZipOutputStream to 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, you don't need to calculate them yourself. Unfortunately, this is not possible for the STORED method, where setting the CRC and
uncompressed size information is required before putArchiveEntry(ZipArchiveEntry) can be called.
As of Apache Commons Compress 1.3, the class transparently supports Zip64 extensions and thus individual entries and archives larger than 4 GB or with more
than 65,536 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.File file,
long zipSplitSize)
Creates a split ZIP Archive.
|
ZipArchiveOutputStream(java.io.OutputStream out)
Creates a new ZIP OutputStream filtering the underlying stream.
|
ZipArchiveOutputStream(java.nio.file.Path path,
long zipSplitSize)
Creates a split ZIP Archive.
|
ZipArchiveOutputStream(java.nio.file.Path file,
java.nio.file.OpenOption... options)
Creates a new ZIP OutputStream writing to a Path.
|
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.
|
ZipArchiveEntry |
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.
|
ZipArchiveEntry |
createArchiveEntry(java.nio.file.Path inputPath,
java.lang.String entryName,
java.nio.file.LinkOption... options)
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.
|
long |
getBytesWritten()
Returns the total number of bytes written to this stream.
|
java.lang.String |
getEncoding()
The encoding to use for file names 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(ZipArchiveEntry archiveEntry)
Writes the headers for an archive entry to the output stream.
|
void |
setComment(java.lang.String comment)
Sets 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 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.
|
void |
write(byte[] b,
int offset,
int length)
Writes bytes to ZIP entry.
|
void |
writePreamble(byte[] preamble)
Write preamble data.
|
void |
writePreamble(byte[] preamble,
int offset,
int length)
Write preamble data.
|
getCount, writepublic 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.File file)
throws java.io.IOException
file - the file to ZIP tojava.io.IOException - on errorpublic ZipArchiveOutputStream(java.io.File file,
long zipSplitSize)
throws java.io.IOException
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.
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.java.io.IOException - on errorjava.lang.IllegalArgumentException - if zipSplitSize is not in the required rangepublic ZipArchiveOutputStream(java.io.OutputStream out)
out - the outputstream to zippublic ZipArchiveOutputStream(java.nio.file.Path path,
long zipSplitSize)
throws java.io.IOException
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.
path - the path to 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.java.io.IOException - on errorjava.lang.IllegalArgumentException - if zipSplitSize is not in the required rangepublic ZipArchiveOutputStream(java.nio.file.Path file,
java.nio.file.OpenOption... options)
throws java.io.IOException
file - the file to ZIP tooptions - options specifying how the file is opened.java.io.IOException - on errorpublic ZipArchiveOutputStream(java.nio.channels.SeekableByteChannel channel)
SeekableInMemoryByteChannel allows you to write to an in-memory archive using random access.
channel - the channel to ZIP topublic void addRawArchiveEntry(ZipArchiveEntry entry, java.io.InputStream rawStream) throws java.io.IOException
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.
entry - The archive entry to addrawStream - The raw input stream of a different entry. May be compressed/encrypted.java.io.IOException - If copying failspublic 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<ZipArchiveEntry>ae - the entry to testpublic void close()
throws java.io.IOException
close in interface java.io.Closeableclose in interface java.lang.AutoCloseableclose in class java.io.OutputStreamjava.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 closeArchiveEntry()
throws java.io.IOException
closeArchiveEntry in class ArchiveOutputStream<ZipArchiveEntry>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 ZipArchiveEntry 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<ZipArchiveEntry>inputFile - the file to create the entry fromentryName - name to use for the entryjava.io.IOException - if an I/O error occurspublic ZipArchiveEntry createArchiveEntry(java.nio.file.Path inputPath, java.lang.String entryName, java.nio.file.LinkOption... options) 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<ZipArchiveEntry>inputPath - path to create the entry from.entryName - name of the entry.options - options indicating how symbolic links are handled.java.io.IOException - if an I/O error occurs.public void finish()
throws java.io.IOException
finish in class ArchiveOutputStream<ZipArchiveEntry>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 flush()
throws java.io.IOException
flush in interface java.io.Flushableflush in class java.io.OutputStreamjava.io.IOException - if an I/O error occurs.public long getBytesWritten()
getBytesWritten in class ArchiveOutputStream<ZipArchiveEntry>public java.lang.String getEncoding()
public boolean isSeekable()
For seekable streams, you don't need to calculate the CRC or uncompressed size for STORED entries before invoking
putArchiveEntry(ZipArchiveEntry).
public void putArchiveEntry(ZipArchiveEntry archiveEntry) throws java.io.IOException
ArchiveOutputStream.closeArchiveEntry()
to complete the process.putArchiveEntry in class ArchiveOutputStream<ZipArchiveEntry>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 setCreateUnicodeExtraFields(ZipArchiveOutputStream.UnicodeExtraFieldPolicy b)
Defaults to NEVER.
b - whether to create Unicode Extra Fields.public void setEncoding(java.lang.String encoding)
For a list of possible values see Supported Encodings. Defaults to UTF-8.
encoding - the encoding to use for file names, use null for the platform's default encodingpublic 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 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 void setUseLanguageEncodingFlag(boolean b)
Defaults to true.
b - whether to set the language encoding flag if the file name encoding is UTF-8public void setUseZip64(Zip64Mode mode)
When setting the mode to Never, putArchiveEntry(org.apache.commons.compress.archivers.zip.ZipArchiveEntry), 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 65,536 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.zip.ZipArchiveEntry) 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.zip.ZipArchiveEntry) 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.zip.ZipArchiveEntry) 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 write(byte[] b,
int offset,
int length)
throws java.io.IOException
write in class java.io.OutputStreamb - the byte array to writeoffset - the start position to write fromlength - the number of bytes to writejava.io.IOException - on errorpublic void writePreamble(byte[] preamble)
throws java.io.IOException
preamble - data to writejava.io.IOException - if an entry already existspublic void writePreamble(byte[] preamble,
int offset,
int length)
throws java.io.IOException
preamble - data to writeoffset - the start offset in the datalength - the number of bytes to writejava.io.IOException - if an entry already existsCopyright © 2010 - 2024 Adobe. All Rights Reserved