org.apache.tools.zip

Class ZipOutputStream

public class ZipOutputStream extends FilterOutputStream

Reimplementation of java.util.zip.ZipOutputStream 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 java.io.RandomAccessFile 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.

Nested Class Summary
static classZipOutputStream.UnicodeExtraFieldPolicy
enum that represents the possible policies for creating Unicode extra fields.
Field Summary
protected byte[]buf
This buffer servers as a Deflater.
protected static byte[]CFH_SIG
central file header signature
protected Deflaterdef
This Deflater object is used for output.
protected static byte[]DD_SIG
data descriptor signature
static intDEFAULT_COMPRESSION
Default compression level for deflated entries.
static intDEFLATED
Compression method for deflated entries.
static intEFS_FLAG
General purpose flag, which indicates that filenames are written in utf-8.
protected static byte[]EOCD_SIG
end of central dir signature
protected static byte[]LFH_SIG
local file header signature
static intSTORED
Compression method for stored entries.
static intUFT8_NAMES_FLAG
General purpose flag, which indicates that filenames are written in utf-8.
Constructor Summary
ZipOutputStream(OutputStream out)
Creates a new ZIP OutputStream filtering the underlying stream.
ZipOutputStream(File file)
Creates a new ZIP OutputStream writing to a File.
Method Summary
protected static longadjustToLong(int i)
Assumes a negative integer really is a positive integer that has wrapped around and re-creates the original value.
voidclose()
Closes this output stream and releases any system resources associated with the stream.
voidcloseEntry()
Writes all necessary data for this entry.
protected voiddeflate()
Writes next block of compressed data to the output stream.
voidfinish()
Finishs writing the contents and closes this as well as the underlying stream.
voidflush()
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.
StringgetEncoding()
The encoding to use for filenames and the file comment.
booleanisSeekable()
This method indicates whether this archive is writing to a seekable stream (i.e., to a random access file).
voidputNextEntry(ZipEntry ze)
Begin writing next entry.
voidsetComment(String comment)
Set the file comment.
voidsetCreateUnicodeExtraFields(ZipOutputStream.UnicodeExtraFieldPolicy b)
Whether to create Unicode Extra Fields.
voidsetEncoding(String encoding)
The encoding to use for filenames and the file comment.
voidsetFallbackToUTF8(boolean b)
Whether to fall back to UTF and the language encoding flag if the file name cannot be encoded using the specified encoding.
voidsetLevel(int level)
Sets the compression level for subsequent entries.
voidsetMethod(int method)
Sets the default compression method for subsequent entries.
voidsetUseLanguageEncodingFlag(boolean b)
Whether to set the language encoding flag if the file name encoding is UTF-8.
protected static ZipLongtoDosTime(Date time)
Convert a Date object to a DOS date/time field.
protected static byte[]toDosTime(long t)
Convert a Date object to a DOS date/time field.
voidwrite(byte[] b, int offset, int length)
Writes bytes to ZIP entry.
voidwrite(int b)
Writes a single byte to ZIP entry.
protected voidwriteCentralDirectoryEnd()
Writes the "End of central dir record".
protected voidwriteCentralFileHeader(ZipEntry ze)
Writes the central file header entry.
protected voidwriteDataDescriptor(ZipEntry ze)
Writes the data descriptor entry.
protected voidwriteLocalFileHeader(ZipEntry ze)
Writes the local file header entry
protected voidwriteOut(byte[] data)
Write bytes to output or random access file.
protected voidwriteOut(byte[] data, int offset, int length)
Write bytes to output or random access file.

Field Detail

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 java.util.zip.DeflaterOutputStream DeflaterOutputStream up to Revision 1.13.

Since: 1.14

CFH_SIG

protected static final byte[] CFH_SIG
central file header signature

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 java.util.zip.DeflaterOutputStream DeflaterOutputStream up to Revision 1.13.

Since: 1.14

DD_SIG

protected static final byte[] DD_SIG
data descriptor signature

Since: 1.1

DEFAULT_COMPRESSION

public static final int DEFAULT_COMPRESSION
Default compression level for deflated entries.

Since: Ant 1.7

DEFLATED

public static final int DEFLATED
Compression method for deflated entries.

Since: 1.1

EFS_FLAG

public static final int EFS_FLAG

Deprecated: use UFT8_NAMES_FLAG instead

General purpose flag, which indicates that filenames are written in utf-8.

EOCD_SIG

protected static final byte[] EOCD_SIG
end of central dir signature

Since: 1.1

LFH_SIG

protected static final byte[] LFH_SIG
local file header signature

Since: 1.1

STORED

public static final int STORED
Compression method for stored entries.

Since: 1.1

UFT8_NAMES_FLAG

public static final int UFT8_NAMES_FLAG
General purpose flag, which indicates that filenames are written in utf-8.

Constructor Detail

ZipOutputStream

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

Parameters: out the outputstream to zip

Since: 1.1

ZipOutputStream

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

Parameters: file the file to zip to

Throws: IOException on error

Since: 1.14

Method Detail

adjustToLong

protected static long adjustToLong(int i)
Assumes a negative integer really is a positive integer that has wrapped around and re-creates the original value.

Parameters: i the value to treat as unsigned int.

Returns: the unsigned int as a long.

Since: 1.34

close

public void close()
Closes this output stream and releases any system resources associated with the stream.

Throws: IOException if an I/O error occurs.

Since: 1.14

closeEntry

public void closeEntry()
Writes all necessary data for this entry.

Throws: IOException on error

Since: 1.1

deflate

protected final void deflate()
Writes next block of compressed data to the output stream.

Throws: IOException on error

Since: 1.14

finish

public void finish()
Finishs writing the contents and closes this as well as the underlying stream.

Throws: IOException on error

Since: 1.1

flush

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

Throws: IOException if an I/O error occurs.

Since: 1.14

getBytes

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

Parameters: name the string to get bytes from

Returns: the bytes as a byte array

Throws: ZipException on error

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()
This method indicates whether this archive is writing to a seekable stream (i.e., to a random access file).

For seekable streams, you don't need to calculate the CRC or uncompressed size for STORED entries before invoking ZipOutputStream.

Returns: true if seekable

Since: 1.17

putNextEntry

public void putNextEntry(ZipEntry ze)
Begin writing next entry.

Parameters: ze the entry to write

Throws: IOException on error

Since: 1.1

setComment

public void setComment(String comment)
Set the file comment.

Parameters: comment the comment

Since: 1.1

setCreateUnicodeExtraFields

public void setCreateUnicodeExtraFields(ZipOutputStream.UnicodeExtraFieldPolicy b)
Whether to create Unicode Extra Fields.

Defaults to NEVER.

setEncoding

public void setEncoding(String encoding)
The encoding to use for filenames and the file comment.

For a list of possible values see http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html. Defaults to the platform's default character encoding.

Parameters: encoding the encoding value

Since: 1.3

setFallbackToUTF8

public 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.

Defaults to false.

setLevel

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

Default is Deflater.DEFAULT_COMPRESSION.

Parameters: level the compression level.

Throws: IllegalArgumentException if an invalid compression level is specified.

Since: 1.1

setMethod

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

Default is DEFLATED.

Parameters: method an int from java.util.zip.ZipEntry

Since: 1.1

setUseLanguageEncodingFlag

public void setUseLanguageEncodingFlag(boolean b)
Whether to set the language encoding flag if the file name encoding is UTF-8.

Defaults to true.

toDosTime

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

Parameters: time the Date to convert

Returns: the date as a ZipLong

Since: 1.1

toDosTime

protected static byte[] toDosTime(long t)
Convert a Date object to a DOS date/time field.

Stolen from InfoZip's fileio.c

Parameters: t number of milliseconds since the epoch

Returns: the date as a byte array

Since: 1.26

write

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

Parameters: b the byte array to write offset the start position to write from length the number of bytes to write

Throws: IOException on error

write

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

Delegates to the three arg method.

Parameters: b the byte to write

Throws: IOException on error

Since: 1.14

writeCentralDirectoryEnd

protected void writeCentralDirectoryEnd()
Writes the "End of central dir record".

Throws: IOException on error

Since: 1.1

writeCentralFileHeader

protected void writeCentralFileHeader(ZipEntry ze)
Writes the central file header entry.

Parameters: ze the entry to write

Throws: IOException on error

Since: 1.1

writeDataDescriptor

protected void writeDataDescriptor(ZipEntry ze)
Writes the data descriptor entry.

Parameters: ze the entry to write

Throws: IOException on error

Since: 1.1

writeLocalFileHeader

protected void writeLocalFileHeader(ZipEntry ze)
Writes the local file header entry

Parameters: ze the entry to write

Throws: IOException on error

Since: 1.1

writeOut

protected final void writeOut(byte[] data)
Write bytes to output or random access file.

Parameters: data the byte array to write

Throws: IOException on error

Since: 1.14

writeOut

protected final void writeOut(byte[] data, int offset, int length)
Write bytes to output or random access file.

Parameters: data the byte array to write offset the start position to write from length the number of bytes to write

Throws: IOException on error

Since: 1.14