org.apache.commons.compress.archivers.zip
Class ZipOutputStream

java.lang.Object
  extended by java.io.OutputStream
      extended by java.io.FilterOutputStream
          extended by java.util.zip.DeflaterOutputStream
              extended by org.apache.commons.compress.archivers.zip.ZipOutputStream
All Implemented Interfaces:
java.io.Closeable, java.io.Flushable

 class ZipOutputStream
extends java.util.zip.DeflaterOutputStream

Reimplementation of 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 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
protected static ZipLong CFH_SIG
          central file header signature
protected static ZipLong DD_SIG
          data descriptor signature
static 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 signature
protected static ZipLong LFH_SIG
          local file header signature
private 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 entry
private  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.
 
Fields inherited from class java.util.zip.DeflaterOutputStream
buf, def
 
Fields inherited from class java.io.FilterOutputStream
out
 
Constructor Summary
ZipOutputStream(java.io.OutputStream output)
          Creates a new ZIP OutputStream filtering the underlying stream.
 
Method Summary
 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 entry
protected  void writeDataDescriptor(ZipEntry ze)
          Writes the data descriptor entry
protected  void writeLocalFileHeader(ZipEntry entry)
          Writes the local file header entry
 
Methods inherited from class java.util.zip.DeflaterOutputStream
close, deflate, write
 
Methods inherited from class java.io.FilterOutputStream
flush, write
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

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
Constructor Detail

ZipOutputStream

public ZipOutputStream(java.io.OutputStream output)
Creates a new ZIP OutputStream filtering the underlying stream.

Parameters:
output - the output stream to write to
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 class java.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 class java.util.zip.DeflaterOutputStream
Parameters:
buffer - the buffer to write to
offset - the offset to write to
length - 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