Class ZipSplitReadOnlySeekableByteChannel

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, java.nio.channels.ByteChannel, java.nio.channels.Channel, java.nio.channels.ReadableByteChannel, java.nio.channels.SeekableByteChannel, java.nio.channels.WritableByteChannel

    public class ZipSplitReadOnlySeekableByteChannel
    extends MultiReadOnlySeekableByteChannel
    MultiReadOnlySeekableByteChannel that knows what a split ZIP archive should look like.

    If you want to read a split archive using ZipArchiveReader then create an instance of this class from the parts of the archive.

    Since:
    1.20
    • Field Detail

      • EMPTY_PATH_ARRAY

        private static final java.nio.file.Path[] EMPTY_PATH_ARRAY
      • ZIP_SPLIT_SIGNATURE_LENGTH

        private static final int ZIP_SPLIT_SIGNATURE_LENGTH
        See Also:
        Constant Field Values
      • zipSplitSignatureByteBuffer

        private final java.nio.ByteBuffer zipSplitSignatureByteBuffer
    • Constructor Detail

      • ZipSplitReadOnlySeekableByteChannel

        public ZipSplitReadOnlySeekableByteChannel​(java.util.List<java.nio.channels.SeekableByteChannel> channels)
                                            throws java.io.IOException
        Concatenates the given channels.

        The channels should be add in ascending order, e.g. z01, z02, ... z99, ZIP please note that the .zip file is the last segment and should be added as the last one in the channels

        Parameters:
        channels - the channels to concatenate
        Throws:
        java.lang.NullPointerException - if channels is null
        java.io.IOException - if the first channel doesn't seem to hold the beginning of a split archive
    • Method Detail

      • buildFromLastSplitSegment

        public static java.nio.channels.SeekableByteChannel buildFromLastSplitSegment​(java.nio.file.Path lastSegmentPath)
                                                                               throws java.io.IOException
        Concatenates ZIP split files from the last segment (the extension MUST be .zip)
        Parameters:
        lastSegmentPath - the last segment of ZIP split files, note that the extension MUST be .zip
        Returns:
        SeekableByteChannel that concatenates all ZIP split files
        Throws:
        java.lang.IllegalArgumentException - if the lastSegmentPath's extension is NOT .zip
        java.io.IOException - if the first channel doesn't seem to hold the beginning of a split archive
        Since:
        1.22
      • forOrderedSeekableByteChannels

        public static java.nio.channels.SeekableByteChannel forOrderedSeekableByteChannels​(java.nio.channels.SeekableByteChannel... channels)
                                                                                    throws java.io.IOException
        Concatenates the given channels.
        Parameters:
        channels - the channels to concatenate, note that the LAST CHANNEL of channels should be the LAST SEGMENT(.zip) and these channels should be added in correct order (e.g. .z01, .z02... .z99, .zip)
        Returns:
        SeekableByteChannel that concatenates all provided channels
        Throws:
        java.lang.NullPointerException - if channels is null
        java.io.IOException - if reading channels fails
      • forOrderedSeekableByteChannels

        public static java.nio.channels.SeekableByteChannel forOrderedSeekableByteChannels​(java.nio.channels.SeekableByteChannel lastSegmentChannel,
                                                                                           java.lang.Iterable<java.nio.channels.SeekableByteChannel> channels)
                                                                                    throws java.io.IOException
        Concatenates the given channels.
        Parameters:
        lastSegmentChannel - channel of the last segment of split ZIP segments, its extension should be .zip
        channels - the channels to concatenate except for the last segment, note these channels should be added in correct order (e.g. .z01, .z02... .z99)
        Returns:
        SeekableByteChannel that concatenates all provided channels
        Throws:
        java.lang.NullPointerException - if lastSegmentChannel or channels is null
        java.io.IOException - if the first channel doesn't seem to hold the beginning of a split archive
      • forPaths

        public static java.nio.channels.SeekableByteChannel forPaths​(java.util.List<java.nio.file.Path> paths,
                                                                     java.nio.file.OpenOption[] openOptions)
                                                              throws java.io.IOException
        Concatenates the given file paths.
        Parameters:
        paths - the file paths to concatenate, note that the LAST FILE of files should be the LAST SEGMENT(.zip) and these files should be added in correct order (e.g.: .z01, .z02... .z99, .zip)
        openOptions - the options to open paths (shared by all paths).
        Returns:
        SeekableByteChannel that concatenates all provided files
        Throws:
        java.lang.NullPointerException - if files is null
        java.io.IOException - if opening a channel for one of the files fails
        java.io.IOException - if the first channel doesn't seem to hold the beginning of a split archive
        Since:
        1.22
      • forPaths

        public static java.nio.channels.SeekableByteChannel forPaths​(java.nio.file.Path... paths)
                                                              throws java.io.IOException
        Concatenates the given file paths.
        Parameters:
        paths - the file paths to concatenate, note that the LAST FILE of files should be the LAST SEGMENT(.zip) and these files should be added in correct order (e.g.: .z01, .z02... .z99, .zip)
        Returns:
        SeekableByteChannel that concatenates all provided files
        Throws:
        java.lang.NullPointerException - if files is null
        java.io.IOException - if opening a channel for one of the files fails
        java.io.IOException - if the first channel doesn't seem to hold the beginning of a split archive
        Since:
        1.22
      • forPaths

        public static java.nio.channels.SeekableByteChannel forPaths​(java.nio.file.Path lastSegmentPath,
                                                                     java.lang.Iterable<java.nio.file.Path> paths)
                                                              throws java.io.IOException
        Concatenates the given file paths.
        Parameters:
        lastSegmentPath - the last segment path of split ZIP segments, its extension must be .zip
        paths - the file paths to concatenate except for the last segment, note these files should be added in correct order (e.g.: .z01, .z02... .z99)
        Returns:
        SeekableByteChannel that concatenates all provided files
        Throws:
        java.io.IOException - if the first channel doesn't seem to hold the beginning of a split archive
        java.lang.NullPointerException - if files or lastSegmentPath is null
        Since:
        1.22
      • assertSplitSignature

        private void assertSplitSignature​(java.util.List<java.nio.channels.SeekableByteChannel> channels)
                                   throws java.io.IOException
        Based on the ZIP specification:

        8.5.3 Spanned/Split archives created using PKZIP for Windows (V2.50 or greater), PKZIP Command Line (V2.50 or greater), or PKZIP Explorer will include a special spanning signature as the first 4 bytes of the first segment of the archive. This signature (0x08074b50) will be followed immediately by the local header signature for the first file in the archive.

        The first 4 bytes of the first ZIP split segment should be the ZIP split signature(0x08074B50)

        Parameters:
        channels - channels to be validated
        Throws:
        java.io.IOException