Class ZipOutputStream

  • All Implemented Interfaces:
    java.io.Closeable, java.io.Flushable, java.lang.AutoCloseable

    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

      Fields 
      Modifier and Type Field Description
      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

      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 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, flush, write
      • Methods inherited from class java.io.FilterOutputStream

        write
      • Methods inherited from class java.io.OutputStream

        nullOutputStream
      • 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_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
      • 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