This is an automated email from the ASF dual-hosted git repository. bodewig pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-compress.git
The following commit(s) were added to refs/heads/master by this push: new 6615be0 COMPRESS-231 document how to read 7z multi volume archives 6615be0 is described below commit 6615be084bf20b0044fbd8cb8ac869340e1336d9 Author: Stefan Bodewig <bode...@apache.org> AuthorDate: Mon Aug 19 22:06:49 2019 +0200 COMPRESS-231 document how to read 7z multi volume archives --- src/changes/changes.xml | 6 ++++++ .../commons/compress/archivers/sevenz/SevenZFile.java | 5 +++++ src/site/xdoc/examples.xml | 5 ++++- src/site/xdoc/limitations.xml | 7 ++++--- .../commons/compress/archivers/sevenz/SevenZFileTest.java | 9 +++++++++ src/test/resources/bla-multi.7z.001 | Bin 0 -> 512 bytes src/test/resources/bla-multi.7z.002 | Bin 0 -> 7 bytes 7 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 02cd688..63dbc58 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -149,6 +149,12 @@ when they are read via ZipArchiveInputStream or ZipFile. exception prevents users from thinking they had successfully read the contents of the archive. </action> + <action type="add" date="2019-08-18" issue="COMPRESS-231" + due-to="Tim Underwood"> + Added a <code>MultiReadOnlySeekableByteChannel</code> class + that can be used to concatenate the parts of a multi volume 7z + archive so that <code>SevenZFile</code> can read them. + </action> </release> <release version="1.18" date="2018-08-16" description="Release 1.18"> diff --git a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java index eba32e3..3580e6d 100644 --- a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java +++ b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java @@ -72,6 +72,11 @@ import org.apache.commons.compress.utils.InputStreamStatistics; * contents can be read, but the use of * encryption isn't plausibly deniable. * + * <p>Multi volume archives can be read by concatenating the parts in + * correct order - either manually or by using {link + * org.apache.commons.compress.utils.MultiReadOnlySeekableByteChannel} + * for example.</p> + * * @NotThreadSafe * @since 1.6 */ diff --git a/src/site/xdoc/examples.xml b/src/site/xdoc/examples.xml index b2ed464..e50ebd9 100644 --- a/src/site/xdoc/examples.xml +++ b/src/site/xdoc/examples.xml @@ -304,7 +304,10 @@ try (OutputStream fo = Files.newOutputStream(Paths.get("my.tar.gz")); Deflate are supported - in addition to those reading supports AES-256/SHA-256 and DEFLATE64.</p> - <p>Multipart archives are not supported at all.</p> + <p>Writing multipart archives is not supported at + all. Multipart archives can be read by concatenating the parts + for example by using + <code>MultiReadOnlySeekableByteChannel</code>.</p> <p>7z archives can use multiple compression and encryption methods as well as filters combined as a pipeline of methods diff --git a/src/site/xdoc/limitations.xml b/src/site/xdoc/limitations.xml index 6d24625..1dbe1f2 100644 --- a/src/site/xdoc/limitations.xml +++ b/src/site/xdoc/limitations.xml @@ -59,9 +59,10 @@ LZMA.</li> <li>Several of the "methods" supported by 7z are not implemented in Compress.</li> - <li>No support for multi-volume archives. It seems multi - volume archives can be concatenated and then read by - <code>SevenZFile</code>, though.</li> + <li>No support for writing multi-volume archives Such + archives can be read by simply concatenating the parts, for + example by using + <code>MultiReadOnlySeekableByteChannel</code>.</li> <li>Support for some BCJ filters and the DELTA filter has been added with Compress 1.8. Because of a known bug in version 1.4 of the <a diff --git a/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java b/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java index dfb81b2..4ce07ee 100644 --- a/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/sevenz/SevenZFileTest.java @@ -36,6 +36,7 @@ import org.apache.commons.compress.AbstractTestCase; import org.apache.commons.compress.MemoryLimitException; import org.apache.commons.compress.PasswordRequiredException; import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.compress.utils.MultiReadOnlySeekableByteChannel; import org.apache.commons.compress.utils.SeekableInMemoryByteChannel; import org.junit.Test; @@ -302,6 +303,14 @@ public class SevenZFileTest extends AbstractTestCase { } } + @Test + public void test7zMultiVolumeUnarchive() throws Exception { + try (SevenZFile sevenZFile = new SevenZFile(MultiReadOnlySeekableByteChannel + .forFiles(getFile("bla-multi.7z.001"), getFile("bla-multi.7z.002")))) { + test7zUnarchive(sevenZFile, SevenZMethod.LZMA2); + } + } + private void test7zUnarchive(final File f, final SevenZMethod m, final byte[] password) throws Exception { try (SevenZFile sevenZFile = new SevenZFile(f, password)) { test7zUnarchive(sevenZFile, m); diff --git a/src/test/resources/bla-multi.7z.001 b/src/test/resources/bla-multi.7z.001 new file mode 100644 index 0000000..2b7a0ec Binary files /dev/null and b/src/test/resources/bla-multi.7z.001 differ diff --git a/src/test/resources/bla-multi.7z.002 b/src/test/resources/bla-multi.7z.002 new file mode 100644 index 0000000..27cd097 Binary files /dev/null and b/src/test/resources/bla-multi.7z.002 differ