Class ZipOutputStream
- java.lang.Object
-
- java.io.OutputStream
-
- java.io.FilterOutputStream
-
- java.util.zip.DeflaterOutputStream
-
- org.apache.commons.compress.archivers.zip.ZipOutputStream
-
- All Implemented Interfaces:
java.io.Closeable
,java.io.Flushable
,java.lang.AutoCloseable
class ZipOutputStream extends java.util.zip.DeflaterOutputStream
Reimplementation ofjava.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 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
will be called.- Version:
- $Revision: 155439 $
- Author:
- Stefan Bodewig
-
-
Field Summary
Fields Modifier and Type Field Description protected static ZipLong
CFH_SIG
central file header signatureprotected static ZipLong
DD_SIG
data descriptor signaturestatic int
DEFLATED
Compression method for deflated entries.private static ZipLong
DOS_TIME_MIN
Smallest date/time ZIP can handle.protected static ZipLong
EOCD_SIG
end of central dir signatureprotected static ZipLong
LFH_SIG
local file header signatureprivate static byte[]
LZERO
Helper, a 0 as ZipLong.private ZipLong
m_cdLength
Length of central directory.private ZipLong
m_cdOffset
Start of central directory.private java.lang.String
m_comment
The file comment.private java.util.zip.CRC32
m_crc
CRC instance to avoid parsing DEFLATED data twice.private long
m_dataStart
Data for current entry started here.private java.lang.String
m_encoding
The encoding to use for filenames and the file comment.private java.util.ArrayList
m_entries
List of ZipEntries written so far.private ZipEntry
m_entry
Current entry.private int
m_level
Compression level for next entry.private int
m_method
Default compression method for next entry.private java.util.Hashtable
m_offsets
Holds the offsets of the LFH starts for each entryprivate long
m_written
Count the bytes written to out.static int
STORED
Compression method for deflated entries.private static byte[]
ZERO
Helper, a 0 as ZipShort.
-
Constructor Summary
Constructors Constructor Description ZipOutputStream(java.io.OutputStream output)
Creates a new ZIP OutputStream filtering the underlying stream.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
closeEntry()
Writes all necessary data for this entry.void
finish()
Finishs writing the contents and closes this as well as the underlying stream.protected byte[]
getBytes(java.lang.String name)
Retrieve the bytes for the given String in the encoding set for this Stream.java.lang.String
getEncoding()
The encoding to use for filenames and the file comment.void
putNextEntry(ZipEntry entry)
Begin writing next entry.void
setComment(java.lang.String comment)
Set the file comment.void
setEncoding(java.lang.String encoding)
The encoding to use for filenames and the file comment.void
setLevel(int level)
Sets the compression level for subsequent entries.void
setMethod(int method)
Sets the default compression method for subsequent entries.protected static ZipLong
toDosTime(java.util.Date time)
Convert a Date object to a DOS date/time field.void
write(byte[] buffer, int offset, int length)
Writes bytes to ZIP entry.protected void
writeCentralDirectoryEnd()
Writes the "End of central dir record"protected void
writeCentralFileHeader(ZipEntry entry)
Writes the central file header entryprotected void
writeDataDescriptor(ZipEntry ze)
Writes the data descriptor entryprotected void
writeLocalFileHeader(ZipEntry entry)
Writes the local file header entry
-
-
-
Field Detail
-
ZERO
private static final byte[] ZERO
Helper, a 0 as ZipShort.- Since:
- 1.1
-
LZERO
private static final byte[] LZERO
Helper, a 0 as ZipLong.- Since:
- 1.1
-
DEFLATED
public static final int DEFLATED
Compression method for deflated entries.- Since:
- 1.1
- See Also:
- Constant Field Values
-
STORED
public static final int STORED
Compression method for deflated entries.- Since:
- 1.1
- See Also:
- Constant Field Values
-
LFH_SIG
protected static final ZipLong LFH_SIG
local file header signature- Since:
- 1.1
-
DD_SIG
protected static final ZipLong DD_SIG
data descriptor signature- Since:
- 1.1
-
CFH_SIG
protected static final ZipLong CFH_SIG
central file header signature- Since:
- 1.1
-
EOCD_SIG
protected static final ZipLong EOCD_SIG
end of central dir signature- Since:
- 1.1
-
DOS_TIME_MIN
private static final ZipLong DOS_TIME_MIN
Smallest date/time ZIP can handle.- Since:
- 1.1
-
m_comment
private java.lang.String m_comment
The file comment.- Since:
- 1.1
-
m_level
private int m_level
Compression level for next entry.- Since:
- 1.1
-
m_method
private int m_method
Default compression method for next entry.- Since:
- 1.1
-
m_entries
private final java.util.ArrayList m_entries
List of ZipEntries written so far.- Since:
- 1.1
-
m_crc
private final java.util.zip.CRC32 m_crc
CRC instance to avoid parsing DEFLATED data twice.- Since:
- 1.1
-
m_written
private long m_written
Count the bytes written to out.- Since:
- 1.1
-
m_dataStart
private long m_dataStart
Data for current entry started here.- Since:
- 1.1
-
m_cdOffset
private ZipLong m_cdOffset
Start of central directory.- Since:
- 1.1
-
m_cdLength
private ZipLong m_cdLength
Length of central directory.- Since:
- 1.1
-
m_offsets
private final java.util.Hashtable m_offsets
Holds the offsets of the LFH starts for each entry- Since:
- 1.1
-
m_encoding
private java.lang.String m_encoding
The encoding to use for filenames and the file comment.For a list of possible values see http://java.sun.com/products/jdk/1.2/docs/guide/internat/encoding.doc.html . Defaults to the platform's default character encoding.
- Since:
- 1.3
-
m_entry
private ZipEntry m_entry
Current entry.- Since:
- 1.1
-
-
Method Detail
-
toDosTime
protected static ZipLong toDosTime(java.util.Date time)
Convert a Date object to a DOS date/time field.Stolen from InfoZip's
fileio.c
- Parameters:
time
- Description of Parameter- Returns:
- Description of the Returned Value
- Since:
- 1.1
-
setComment
public void setComment(java.lang.String comment)
Set the file comment.- Parameters:
comment
- The new Comment value- Since:
- 1.1
-
setEncoding
public void setEncoding(java.lang.String encoding)
The encoding to use for filenames and the file comment.For a list of possible values see http://java.sun.com/products/jdk/1.2/docs/guide/internat/encoding.doc.html . Defaults to the platform's default character encoding.
- Parameters:
encoding
- The new Encoding value- Since:
- 1.3
-
setLevel
public void setLevel(int level)
Sets the compression level for subsequent entries.Default is Deflater.DEFAULT_COMPRESSION.
- Parameters:
level
- The new Level value- Since:
- 1.1
-
setMethod
public void setMethod(int method)
Sets the default compression method for subsequent entries.Default is DEFLATED.
- Parameters:
method
- The new Method value- Since:
- 1.1
-
getEncoding
public java.lang.String getEncoding()
The encoding to use for filenames and the file comment.- Returns:
- null if using the platform's default character encoding.
- Since:
- 1.3
-
closeEntry
public void closeEntry() throws java.io.IOException
Writes all necessary data for this entry.- Throws:
java.io.IOException
- if an IO failure causes operation to fail- Since:
- 1.1
-
finish
public void finish() throws java.io.IOException
Finishs writing the contents and closes this as well as the underlying stream.- Overrides:
finish
in classjava.util.zip.DeflaterOutputStream
- Throws:
java.io.IOException
- if an IO failure causes operation to fail- Since:
- 1.1
-
putNextEntry
public void putNextEntry(ZipEntry entry) throws java.io.IOException
Begin writing next entry.- Parameters:
entry
- the entry- Throws:
java.io.IOException
- if an IO failure causes operation to fail- Since:
- 1.1
-
write
public void write(byte[] buffer, int offset, int length) throws java.io.IOException
Writes bytes to ZIP entry.Override is necessary to support STORED entries, as well as calculationg CRC automatically for DEFLATED entries.
- Overrides:
write
in classjava.util.zip.DeflaterOutputStream
- Parameters:
buffer
- the buffer to write tooffset
- the offset to write tolength
- the length of data to write- Throws:
java.io.IOException
- if an IO error causes operation to fail
-
getBytes
protected byte[] getBytes(java.lang.String name) throws java.util.zip.ZipException
Retrieve the bytes for the given String in the encoding set for this Stream.- Parameters:
name
- the name to decode- Returns:
- the bytes for string
- Throws:
java.util.zip.ZipException
- if fail to retrieve bytes for specified string- Since:
- 1.3
-
writeCentralDirectoryEnd
protected void writeCentralDirectoryEnd() throws java.io.IOException
Writes the "End of central dir record"- Throws:
java.io.IOException
- when an IO erro causes operation to fail- Since:
- 1.1
-
writeCentralFileHeader
protected void writeCentralFileHeader(ZipEntry entry) throws java.io.IOException
Writes the central file header entry- Parameters:
entry
- the zip entry- Throws:
java.io.IOException
- when an IO error causes operation to fail- Since:
- 1.1
-
writeDataDescriptor
protected void writeDataDescriptor(ZipEntry ze) throws java.io.IOException
Writes the data descriptor entry- Parameters:
ze
- Description of Parameter- Throws:
java.io.IOException
- if an IO failure causes operation to fail- Since:
- 1.1
-
writeLocalFileHeader
protected void writeLocalFileHeader(ZipEntry entry) throws java.io.IOException
Writes the local file header entry- Parameters:
entry
- the zip entry- Throws:
java.io.IOException
- when an IO error causes operation to fail- Since:
- 1.1
-
-