org.codehaus.plexus.archiver.zip

Class ZipOutputStream


public class ZipOutputStream
extends FilterOutputStream

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 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 putNextEntry can be called.

Version:
$Revision: 2436 $ $Date: 2005-09-01 13:20:41 -0400 (Thu, 01 Sep 2005) $ from org.apache.ant.tools.zip.ZipOutputStream v1.24

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.
static int
STORED
Compression method for deflated entries.
private static byte[]
ZERO
Helper, a 0 as ZipShort.
protected byte[]
buf
This buffer servers as a Deflater.
private ZipLong
cdLength
Length of central directory.
private ZipLong
cdOffset
Start of central directory.
private String
comment
The file comment.
private CRC32
crc
CRC instance to avoid parsing DEFLATED data twice.
private long
dataStart
Data for local header data
protected Deflater
def
This Deflater object is used for output.
private String
encoding
The encoding to use for filenames and the file comment.
private Vector
entries
List of ZipEntries written so far.
private ZipEntry
entry
Current entry.
private boolean
hasCompressionLevelChanged
Has the compression level changed when compared to the last entry?
private int
level
Compression level for next entry.
private long
localDataStart
Offset for CRC entry in the local file header data for the current entry starts here.
private int
method
Default compression method for next entry.
private Hashtable
offsets
Holds the offsets of the LFH starts for each entry.
private RandomAccessFile
raf
Optional random access output.
private long
written
Count the bytes written to out.

Constructor Summary

ZipOutputStream(File file)
Creates a new ZIP OutputStream writing to a File.
ZipOutputStream(OutputStream out)
Creates a new ZIP OutputStream filtering the underlying stream.

Method Summary

void
close()
Closes this output stream and releases any system resources associated with the stream.
void
closeEntry()
Writes all necessary data for this entry.
protected void
deflate()
Writes next block of compressed data to the output stream.
void
finish()
Finishs writing the contents and closes this as well as the underlying stream.
void
flush()
Flushes this output stream and forces any buffered output bytes to be written out to the stream.
protected byte[]
getBytes(String name)
Retrieve the bytes for the given String in the encoding set for this 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
putNextEntry(ZipEntry ze)
Begin writing next entry.
void
setComment(String comment)
Set the file comment.
void
setEncoding(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(Date time)
Convert a Date object to a DOS date/time field.
void
write(byte[] b, int offset, int length)
Writes bytes to ZIP entry.
void
write(int b)
Writes a single byte to ZIP entry.
protected void
writeCentralDirectoryEnd()
Writes the "End of central dir record"
protected void
writeCentralFileHeader(ZipEntry ze)
Writes the central file header entry
protected void
writeDataDescriptor(ZipEntry ze)
Writes the data descriptor entry
protected void
writeLocalFileHeader(ZipEntry ze)
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

Field Details

CFH_SIG

protected static final ZipLong CFH_SIG
central file header signature
Since:
1.1

DD_SIG

protected static final ZipLong DD_SIG
data descriptor signature
Since:
1.1

DEFLATED

public static final int DEFLATED
Compression method for deflated entries.
Since:
1.1

DOS_TIME_MIN

private static final ZipLong DOS_TIME_MIN
Smallest date/time ZIP can handle.
Since:
1.1

EOCD_SIG

protected static final ZipLong EOCD_SIG
end of central dir signature
Since:
1.1

LFH_SIG

protected static final ZipLong LFH_SIG
local file header signature
Since:
1.1

LZERO

private static final byte[] LZERO
Helper, a 0 as ZipLong.
Since:
1.1

STORED

public static final int STORED
Compression method for deflated entries.
Since:
1.1

ZERO

private static final byte[] ZERO
Helper, a 0 as ZipShort.
Since:
1.1

buf

protected byte[] buf
This buffer servers as a Deflater.

This attribute is only protected to provide a level of API backwards compatibility. This class used to extend DeflaterOutputStream up to Revision 1.13.

Since:
1.14

cdLength

private ZipLong cdLength
Length of central directory.
Since:
1.1

cdOffset

private ZipLong cdOffset
Start of central directory.
Since:
1.1

comment

private String comment
The file comment.
Since:
1.1

crc

private CRC32 crc
CRC instance to avoid parsing DEFLATED data twice.
Since:
1.1

dataStart

private long dataStart
Data for local header data
Since:
1.1

def

protected Deflater def
This Deflater object is used for output.

This attribute is only protected to provide a level of API backwards compatibility. This class used to extend DeflaterOutputStream up to Revision 1.13.

Since:
1.14

encoding

private String encoding
Since:
1.3

entries

private Vector entries
List of ZipEntries written so far.
Since:
1.1

entry

private ZipEntry entry
Current entry.
Since:
1.1

hasCompressionLevelChanged

private boolean hasCompressionLevelChanged
Has the compression level changed when compared to the last entry?
Since:
1.5

level

private int level
Compression level for next entry.
Since:
1.1

localDataStart

private long localDataStart
Offset for CRC entry in the local file header data for the current entry starts here.
Since:
1.15

method

private int method
Default compression method for next entry.
Since:
1.1

offsets

private Hashtable offsets
Holds the offsets of the LFH starts for each entry.
Since:
1.1

raf

private RandomAccessFile raf
Optional random access output.
Since:
1.14

written

private long written
Count the bytes written to out.
Since:
1.1

Constructor Details

ZipOutputStream

public ZipOutputStream(File file)
            throws IOException
Creates a new ZIP OutputStream writing to a File. Will use random access if possible.
Since:
1.14

ZipOutputStream

public ZipOutputStream(OutputStream out)
Creates a new ZIP OutputStream filtering the underlying stream.
Since:
1.1

Method Details

close

public void close()
            throws IOException
Closes this output stream and releases any system resources associated with the stream.
Since:
1.14

closeEntry

public void closeEntry()
            throws IOException
Writes all necessary data for this entry.
Since:
1.1

deflate

protected final void deflate()
            throws IOException
Writes next block of compressed data to the output stream.
Since:
1.14

finish

public void finish()
            throws IOException
Finishs writing the contents and closes this as well as the underlying stream.
Since:
1.1

flush

public void flush()
            throws IOException
Flushes this output stream and forces any buffered output bytes to be written out to the stream.
Since:
1.14

getBytes

protected byte[] getBytes(String name)
            throws ZipException
Retrieve the bytes for the given String in the encoding set for this Stream.
Since:
1.3

getEncoding

public 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

isSeekable

public boolean isSeekable()
Since:
1.17

putNextEntry

public void putNextEntry(ZipEntry ze)
            throws IOException
Begin writing next entry.
Since:
1.1

setComment

public void setComment(String comment)
Set the file comment.
Since:
1.1

setEncoding

public void setEncoding(String encoding)
Since:
1.3

setLevel

public void setLevel(int level)
Sets the compression level for subsequent entries.

Default is Deflater.DEFAULT_COMPRESSION.

Since:
1.1

setMethod

public void setMethod(int method)
Sets the default compression method for subsequent entries.

Default is DEFLATED.

Since:
1.1

toDosTime

protected static ZipLong toDosTime(Date time)
Convert a Date object to a DOS date/time field.

Stolen from InfoZip's fileio.c

Since:
1.1

write

public void write(byte[] b,
                  int offset,
                  int length)
            throws IOException
Writes bytes to ZIP entry.

write

public void write(int b)
            throws IOException
Writes a single byte to ZIP entry.

Delegates to the three arg method.

Since:
1.14

writeCentralDirectoryEnd

protected void writeCentralDirectoryEnd()
            throws IOException
Writes the "End of central dir record"
Since:
1.1

writeCentralFileHeader

protected void writeCentralFileHeader(ZipEntry ze)
            throws IOException
Writes the central file header entry
Since:
1.1

writeDataDescriptor

protected void writeDataDescriptor(ZipEntry ze)
            throws IOException
Writes the data descriptor entry
Since:
1.1

writeLocalFileHeader

protected void writeLocalFileHeader(ZipEntry ze)
            throws IOException
Writes the local file header entry
Since:
1.1

writeOut

protected final void writeOut(byte[] data)
            throws IOException
Write bytes to output or random access file
Since:
1.14

writeOut

protected final void writeOut(byte[] data,
                              int offset,
                              int length)
            throws IOException
Write bytes to output or random access file
Since:
1.14