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 ZipFile
then create an instance of this class from the parts of
the archive.
Modifier and Type | Class and Description |
---|---|
private static class |
ZipSplitReadOnlySeekableByteChannel.ZipSplitSegmentComparator |
Modifier and Type | Field and Description |
---|---|
private static int |
ZIP_SPLIT_SIGNATURE_LENGTH |
private java.nio.ByteBuffer |
zipSplitSignatureByteBuffer |
Constructor and Description |
---|
ZipSplitReadOnlySeekableByteChannel(java.util.List<java.nio.channels.SeekableByteChannel> channels)
Concatenates the given channels.
|
Modifier and Type | Method and Description |
---|---|
private void |
assertSplitSignature(java.util.List<java.nio.channels.SeekableByteChannel> channels)
Based on the zip specification:
|
static java.nio.channels.SeekableByteChannel |
buildFromLastSplitSegment(java.io.File lastSegmentFile)
Concatenates zip split files from the last segment(the extension SHOULD be .zip)
|
static java.nio.channels.SeekableByteChannel |
forFiles(java.io.File... files)
Concatenates the given files.
|
static java.nio.channels.SeekableByteChannel |
forFiles(java.io.File lastSegmentFile,
java.lang.Iterable<java.io.File> files)
Concatenates the given files.
|
static java.nio.channels.SeekableByteChannel |
forOrderedSeekableByteChannels(java.nio.channels.SeekableByteChannel... channels)
Concatenates the given channels.
|
static java.nio.channels.SeekableByteChannel |
forOrderedSeekableByteChannels(java.nio.channels.SeekableByteChannel lastSegmentChannel,
java.lang.Iterable<java.nio.channels.SeekableByteChannel> channels)
Concatenates the given channels.
|
private static final int ZIP_SPLIT_SIGNATURE_LENGTH
private final java.nio.ByteBuffer zipSplitSignatureByteBuffer
public ZipSplitReadOnlySeekableByteChannel(java.util.List<java.nio.channels.SeekableByteChannel> channels) throws java.io.IOException
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
channels
- the channels to concatenatejava.lang.NullPointerException
- if channels is nulljava.io.IOException
- if the first channel doesn't seem to hold
the beginning of a split archiveprivate void assertSplitSignature(java.util.List<java.nio.channels.SeekableByteChannel> channels) throws java.io.IOException
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)
channels
- channels to be validedjava.io.IOException
public static java.nio.channels.SeekableByteChannel forOrderedSeekableByteChannels(java.nio.channels.SeekableByteChannel... channels) throws java.io.IOException
channels
- the channels to concatenate, note that the LAST CHANNEL of channels should be the LAST SEGMENT(.zip)
and theses channels should be added in correct order (e.g. .z01, .z02... .z99, .zip)java.lang.NullPointerException
- if channels is nulljava.io.IOException
- if reading channels failspublic static java.nio.channels.SeekableByteChannel forOrderedSeekableByteChannels(java.nio.channels.SeekableByteChannel lastSegmentChannel, java.lang.Iterable<java.nio.channels.SeekableByteChannel> channels) throws java.io.IOException
lastSegmentChannel
- channel of the last segment of split zip segments, its extension should be .zipchannels
- the channels to concatenate except for the last segment,
note theses channels should be added in correct order (e.g. .z01, .z02... .z99)java.lang.NullPointerException
- if lastSegmentChannel or channels is nulljava.io.IOException
- if the first channel doesn't seem to hold
the beginning of a split archivepublic static java.nio.channels.SeekableByteChannel buildFromLastSplitSegment(java.io.File lastSegmentFile) throws java.io.IOException
lastSegmentFile
- the last segment of zip split files, note that the extension SHOULD be .zipjava.lang.IllegalArgumentException
- if the lastSegmentFile's extension is NOT .zipjava.io.IOException
- if the first channel doesn't seem to hold
the beginning of a split archivepublic static java.nio.channels.SeekableByteChannel forFiles(java.io.File... files) throws java.io.IOException
files
- the files to concatenate, note that the LAST FILE of files should be the LAST SEGMENT(.zip)
and theses files should be added in correct order (e.g. .z01, .z02... .z99, .zip)java.lang.NullPointerException
- if files is nulljava.io.IOException
- if opening a channel for one of the files failsjava.io.IOException
- if the first channel doesn't seem to hold
the beginning of a split archivepublic static java.nio.channels.SeekableByteChannel forFiles(java.io.File lastSegmentFile, java.lang.Iterable<java.io.File> files) throws java.io.IOException
lastSegmentFile
- the last segment of split zip segments, its extension should be .zipfiles
- the files to concatenate except for the last segment,
note theses files should be added in correct order (e.g. .z01, .z02... .z99)java.io.IOException
- if the first channel doesn't seem to hold
the beginning of a split archivejava.lang.NullPointerException
- if files or lastSegmentFile is null