Class ZipSplitOutputStream

java.lang.Object
java.io.OutputStream
org.apache.commons.compress.archivers.zip.ZipSplitOutputStream
All Implemented Interfaces:
Closeable, Flushable, AutoCloseable

class ZipSplitOutputStream extends OutputStream
Used internally by ZipArchiveOutputStream when creating a split archive.
Since:
1.20
  • Field Details

    • outputStream

      private OutputStream outputStream
    • zipFile

      private File zipFile
    • splitSize

      private final long splitSize
    • currentSplitSegmentIndex

      private int currentSplitSegmentIndex
    • currentSplitSegmentBytesWritten

      private long currentSplitSegmentBytesWritten
    • finished

      private boolean finished
    • singleByte

      private final byte[] singleByte
    • ZIP_SEGMENT_MIN_SIZE

      private static final long ZIP_SEGMENT_MIN_SIZE
      8.5.1 Capacities for split archives are as follows:

      Maximum number of segments = 4,294,967,295 - 1 Maximum .ZIP segment size = 4,294,967,295 bytes (refer to section 8.5.6) Minimum segment size = 64K Maximum PKSFX segment size = 2,147,483,647 bytes

      See Also:
    • ZIP_SEGMENT_MAX_SIZE

      private static final long ZIP_SEGMENT_MAX_SIZE
      See Also:
  • Constructor Details

    • ZipSplitOutputStream

      public ZipSplitOutputStream(File zipFile, long splitSize) throws IllegalArgumentException, IOException
      Create a split zip. If the zip file is smaller than the split size, then there will only be one split zip, and its suffix is .zip, otherwise the split segments should be like .z01, .z02, ... .z(N-1), .zip
      Parameters:
      zipFile - the zip file to write to
      splitSize - the split size
      Throws:
      IllegalArgumentException
      IOException
  • Method Details

    • prepareToWriteUnsplittableContent

      public void prepareToWriteUnsplittableContent(long unsplittableContentSize) throws IllegalArgumentException, IOException
      Some data can not be written to different split segments, for example:

      4.4.1.5 The end of central directory record and the Zip64 end of central directory locator record MUST reside on the same disk when splitting or spanning an archive.

      Parameters:
      unsplittableContentSize -
      Throws:
      IllegalArgumentException
      IOException
    • write

      public void write(int i) throws IOException
      Specified by:
      write in class OutputStream
      Throws:
      IOException
    • write

      public void write(byte[] b) throws IOException
      Overrides:
      write in class OutputStream
      Throws:
      IOException
    • write

      public void write(byte[] b, int off, int len) throws IOException
      Write the data to zip split segments, if the remaining space of current split segment is not enough, then a new split segment should be created
      Overrides:
      write in class OutputStream
      Parameters:
      b - data to write
      off - offset of the start of data in param b
      len - the length of data to write
      Throws:
      IOException
    • close

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Overrides:
      close in class OutputStream
      Throws:
      IOException
    • finish

      private void finish() throws IOException
      The last zip split segment's suffix should be .zip
      Throws:
      IOException
    • openNewSplitSegment

      private void openNewSplitSegment() throws IOException
      Create a new zip split segment and prepare to write to the new segment
      Throws:
      IOException
    • writeZipSplitSignature

      private void writeZipSplitSignature() throws IOException
      Write the zip split signature (0x08074B50) to the head of the first zip split segment
      Throws:
      IOException
    • createNewSplitSegmentFile

      private File createNewSplitSegmentFile(Integer zipSplitSegmentSuffixIndex) throws IOException
      Create the new zip split segment, the last zip segment should be .zip, and the zip split segments' suffix should be like .z01, .z02, .z03, ... .z99, .z100, ..., .z(N-1), .zip

      8.3.3 Split ZIP files are typically written to the same location and are subject to name collisions if the spanned name format is used since each segment will reside on the same drive. To avoid name collisions, split archives are named as follows.

      Segment 1 = filename.z01 Segment n-1 = filename.z(n-1) Segment n = filename.zip

      NOTE: The zip split segment begin from 1,2,3,... , and we're creating a new segment, so the new segment suffix should be (currentSplitSegmentIndex + 2)

      Parameters:
      zipSplitSegmentSuffixIndex -
      Returns:
      Throws:
      IOException
    • getCurrentSplitSegmentIndex

      public int getCurrentSplitSegmentIndex()
    • getCurrentSplitSegmentBytesWritten

      public long getCurrentSplitSegmentBytesWritten()