1*ba8755cbSAndroid Build Coastguard Worker<?xml version="1.0"?> 2*ba8755cbSAndroid Build Coastguard Worker<!-- 3*ba8755cbSAndroid Build Coastguard Worker 4*ba8755cbSAndroid Build Coastguard Worker Licensed to the Apache Software Foundation (ASF) under one or more 5*ba8755cbSAndroid Build Coastguard Worker contributor license agreements. See the NOTICE file distributed with 6*ba8755cbSAndroid Build Coastguard Worker this work for additional information regarding copyright ownership. 7*ba8755cbSAndroid Build Coastguard Worker The ASF licenses this file to You under the Apache License, Version 2.0 8*ba8755cbSAndroid Build Coastguard Worker (the "License"); you may not use this file except in compliance with 9*ba8755cbSAndroid Build Coastguard Worker the License. You may obtain a copy of the License at 10*ba8755cbSAndroid Build Coastguard Worker 11*ba8755cbSAndroid Build Coastguard Worker http://www.apache.org/licenses/LICENSE-2.0 12*ba8755cbSAndroid Build Coastguard Worker 13*ba8755cbSAndroid Build Coastguard Worker Unless required by applicable law or agreed to in writing, software 14*ba8755cbSAndroid Build Coastguard Worker distributed under the License is distributed on an "AS IS" BASIS, 15*ba8755cbSAndroid Build Coastguard Worker WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16*ba8755cbSAndroid Build Coastguard Worker See the License for the specific language governing permissions and 17*ba8755cbSAndroid Build Coastguard Worker limitations under the License. 18*ba8755cbSAndroid Build Coastguard Worker 19*ba8755cbSAndroid Build Coastguard Worker--> 20*ba8755cbSAndroid Build Coastguard Worker<document> 21*ba8755cbSAndroid Build Coastguard Worker <properties> 22*ba8755cbSAndroid Build Coastguard Worker <title>Commons Compress User Guide</title> 23*ba8755cbSAndroid Build Coastguard Worker <author email="[email protected]">Commons Documentation Team</author> 24*ba8755cbSAndroid Build Coastguard Worker </properties> 25*ba8755cbSAndroid Build Coastguard Worker <body> 26*ba8755cbSAndroid Build Coastguard Worker <section name="General Notes"> 27*ba8755cbSAndroid Build Coastguard Worker 28*ba8755cbSAndroid Build Coastguard Worker <subsection name="Archivers and Compressors"> 29*ba8755cbSAndroid Build Coastguard Worker <p>Commons Compress calls all formats that compress a single 30*ba8755cbSAndroid Build Coastguard Worker stream of data compressor formats while all formats that 31*ba8755cbSAndroid Build Coastguard Worker collect multiple entries inside a single (potentially 32*ba8755cbSAndroid Build Coastguard Worker compressed) archive are archiver formats.</p> 33*ba8755cbSAndroid Build Coastguard Worker 34*ba8755cbSAndroid Build Coastguard Worker <p>The compressor formats supported are gzip, bzip2, xz, lzma, 35*ba8755cbSAndroid Build Coastguard Worker Pack200, DEFLATE, Brotli, DEFLATE64, ZStandard and Z, the archiver formats are 7z, ar, arj, 36*ba8755cbSAndroid Build Coastguard Worker cpio, dump, tar and zip. Pack200 is a special case as it can 37*ba8755cbSAndroid Build Coastguard Worker only compress JAR files.</p> 38*ba8755cbSAndroid Build Coastguard Worker 39*ba8755cbSAndroid Build Coastguard Worker <p>We currently only provide read support for arj, 40*ba8755cbSAndroid Build Coastguard Worker dump, Brotli, DEFLATE64 and Z. arj can only read uncompressed archives, 7z can read 41*ba8755cbSAndroid Build Coastguard Worker archives with many compression and encryption algorithms 42*ba8755cbSAndroid Build Coastguard Worker supported by 7z but doesn't support encryption when writing 43*ba8755cbSAndroid Build Coastguard Worker archives.</p> 44*ba8755cbSAndroid Build Coastguard Worker </subsection> 45*ba8755cbSAndroid Build Coastguard Worker 46*ba8755cbSAndroid Build Coastguard Worker <subsection name="Buffering"> 47*ba8755cbSAndroid Build Coastguard Worker <p>The stream classes all wrap around streams provided by the 48*ba8755cbSAndroid Build Coastguard Worker calling code and they work on them directly without any 49*ba8755cbSAndroid Build Coastguard Worker additional buffering. On the other hand most of them will 50*ba8755cbSAndroid Build Coastguard Worker benefit from buffering so it is highly recommended that 51*ba8755cbSAndroid Build Coastguard Worker users wrap their stream 52*ba8755cbSAndroid Build Coastguard Worker in <code>Buffered<em>(In|Out)</em>putStream</code>s before 53*ba8755cbSAndroid Build Coastguard Worker using the Commons Compress API.</p> 54*ba8755cbSAndroid Build Coastguard Worker 55*ba8755cbSAndroid Build Coastguard Worker </subsection> 56*ba8755cbSAndroid Build Coastguard Worker 57*ba8755cbSAndroid Build Coastguard Worker <subsection name="Factories"> 58*ba8755cbSAndroid Build Coastguard Worker 59*ba8755cbSAndroid Build Coastguard Worker <p>Compress provides factory methods to create input/output 60*ba8755cbSAndroid Build Coastguard Worker streams based on the names of the compressor or archiver 61*ba8755cbSAndroid Build Coastguard Worker format as well as factory methods that try to guess the 62*ba8755cbSAndroid Build Coastguard Worker format of an input stream.</p> 63*ba8755cbSAndroid Build Coastguard Worker 64*ba8755cbSAndroid Build Coastguard Worker <p>To create a compressor writing to a given output by using 65*ba8755cbSAndroid Build Coastguard Worker the algorithm name:</p> 66*ba8755cbSAndroid Build Coastguard Worker <source><![CDATA[ 67*ba8755cbSAndroid Build Coastguard WorkerCompressorOutputStream gzippedOut = new CompressorStreamFactory() 68*ba8755cbSAndroid Build Coastguard Worker .createCompressorOutputStream(CompressorStreamFactory.GZIP, myOutputStream); 69*ba8755cbSAndroid Build Coastguard Worker]]></source> 70*ba8755cbSAndroid Build Coastguard Worker 71*ba8755cbSAndroid Build Coastguard Worker <p>Make the factory guess the input format for a given 72*ba8755cbSAndroid Build Coastguard Worker archiver stream:</p> 73*ba8755cbSAndroid Build Coastguard Worker <source><![CDATA[ 74*ba8755cbSAndroid Build Coastguard WorkerArchiveInputStream input = new ArchiveStreamFactory() 75*ba8755cbSAndroid Build Coastguard Worker .createArchiveInputStream(originalInput); 76*ba8755cbSAndroid Build Coastguard Worker]]></source> 77*ba8755cbSAndroid Build Coastguard Worker 78*ba8755cbSAndroid Build Coastguard Worker <p>Make the factory guess the input format for a given 79*ba8755cbSAndroid Build Coastguard Worker compressor stream:</p> 80*ba8755cbSAndroid Build Coastguard Worker <source><![CDATA[ 81*ba8755cbSAndroid Build Coastguard WorkerCompressorInputStream input = new CompressorStreamFactory() 82*ba8755cbSAndroid Build Coastguard Worker .createCompressorInputStream(originalInput); 83*ba8755cbSAndroid Build Coastguard Worker]]></source> 84*ba8755cbSAndroid Build Coastguard Worker 85*ba8755cbSAndroid Build Coastguard Worker <p>Note that there is no way to detect the lzma or Brotli formats so only 86*ba8755cbSAndroid Build Coastguard Worker the two-arg version of 87*ba8755cbSAndroid Build Coastguard Worker <code>createCompressorInputStream</code> can be used. Prior 88*ba8755cbSAndroid Build Coastguard Worker to Compress 1.9 the .Z format hasn't been auto-detected 89*ba8755cbSAndroid Build Coastguard Worker either.</p> 90*ba8755cbSAndroid Build Coastguard Worker 91*ba8755cbSAndroid Build Coastguard Worker </subsection> 92*ba8755cbSAndroid Build Coastguard Worker 93*ba8755cbSAndroid Build Coastguard Worker <subsection name="Restricting Memory Usage"> 94*ba8755cbSAndroid Build Coastguard Worker <p>Starting with Compress 1.14 95*ba8755cbSAndroid Build Coastguard Worker <code>CompressorStreamFactory</code> has an optional 96*ba8755cbSAndroid Build Coastguard Worker constructor argument that can be used to set an upper limit of 97*ba8755cbSAndroid Build Coastguard Worker memory that may be used while decompressing or compressing a 98*ba8755cbSAndroid Build Coastguard Worker stream. As of 1.14 this setting only affects decompressing Z, 99*ba8755cbSAndroid Build Coastguard Worker XZ and LZMA compressed streams.</p> 100*ba8755cbSAndroid Build Coastguard Worker <p>For the Snappy and LZ4 formats the amount of memory used 101*ba8755cbSAndroid Build Coastguard Worker during compression is directly proportional to the window 102*ba8755cbSAndroid Build Coastguard Worker size.</p> 103*ba8755cbSAndroid Build Coastguard Worker </subsection> 104*ba8755cbSAndroid Build Coastguard Worker 105*ba8755cbSAndroid Build Coastguard Worker <subsection name="Statistics"> 106*ba8755cbSAndroid Build Coastguard Worker <p>Starting with Compress 1.17 most of the 107*ba8755cbSAndroid Build Coastguard Worker <code>CompressorInputStream</code> implementations as well as 108*ba8755cbSAndroid Build Coastguard Worker <code>ZipArchiveInputStream</code> and all streams returned by 109*ba8755cbSAndroid Build Coastguard Worker <code>ZipFile.getInputStream</code> implement the 110*ba8755cbSAndroid Build Coastguard Worker <code>InputStreamStatistics</code> 111*ba8755cbSAndroid Build Coastguard Worker interface. <code>SevenZFile</code> provides statistics for the 112*ba8755cbSAndroid Build Coastguard Worker current entry via the 113*ba8755cbSAndroid Build Coastguard Worker <code>getStatisticsForCurrentEntry</code> method. This 114*ba8755cbSAndroid Build Coastguard Worker interface can be used to track progress while extracting a 115*ba8755cbSAndroid Build Coastguard Worker stream or to detect potential <a 116*ba8755cbSAndroid Build Coastguard Worker href="https://en.wikipedia.org/wiki/Zip_bomb">zip bombs</a> 117*ba8755cbSAndroid Build Coastguard Worker when the compression ration becomes suspiciously large.</p> 118*ba8755cbSAndroid Build Coastguard Worker </subsection> 119*ba8755cbSAndroid Build Coastguard Worker 120*ba8755cbSAndroid Build Coastguard Worker </section> 121*ba8755cbSAndroid Build Coastguard Worker <section name="Archivers"> 122*ba8755cbSAndroid Build Coastguard Worker 123*ba8755cbSAndroid Build Coastguard Worker <subsection name="Unsupported Features"> 124*ba8755cbSAndroid Build Coastguard Worker <p>Many of the supported formats have developed different 125*ba8755cbSAndroid Build Coastguard Worker dialects and extensions and some formats allow for features 126*ba8755cbSAndroid Build Coastguard Worker (not yet) supported by Commons Compress.</p> 127*ba8755cbSAndroid Build Coastguard Worker 128*ba8755cbSAndroid Build Coastguard Worker <p>The <code>ArchiveInputStream</code> class provides a method 129*ba8755cbSAndroid Build Coastguard Worker <code>canReadEntryData</code> that will return false if 130*ba8755cbSAndroid Build Coastguard Worker Commons Compress can detect that an archive uses a feature 131*ba8755cbSAndroid Build Coastguard Worker that is not supported by the current implementation. If it 132*ba8755cbSAndroid Build Coastguard Worker returns false you should not try to read the entry but skip 133*ba8755cbSAndroid Build Coastguard Worker over it.</p> 134*ba8755cbSAndroid Build Coastguard Worker 135*ba8755cbSAndroid Build Coastguard Worker </subsection> 136*ba8755cbSAndroid Build Coastguard Worker 137*ba8755cbSAndroid Build Coastguard Worker <subsection name="Entry Names"> 138*ba8755cbSAndroid Build Coastguard Worker <p>All archive formats provide meta data about the individual 139*ba8755cbSAndroid Build Coastguard Worker archive entries via instances of <code>ArchiveEntry</code> (or 140*ba8755cbSAndroid Build Coastguard Worker rather subclasses of it). When reading from an archive the 141*ba8755cbSAndroid Build Coastguard Worker information provided the <code>getName</code> method is the 142*ba8755cbSAndroid Build Coastguard Worker raw name as stored inside of the archive. There is no 143*ba8755cbSAndroid Build Coastguard Worker guarantee the name represents a relative file name or even a 144*ba8755cbSAndroid Build Coastguard Worker valid file name on your target operating system at all. You 145*ba8755cbSAndroid Build Coastguard Worker should double check the outcome when you try to create file 146*ba8755cbSAndroid Build Coastguard Worker names from entry names.</p> 147*ba8755cbSAndroid Build Coastguard Worker </subsection> 148*ba8755cbSAndroid Build Coastguard Worker 149*ba8755cbSAndroid Build Coastguard Worker <subsection name="Common Extraction Logic"> 150*ba8755cbSAndroid Build Coastguard Worker <p>Apart from 7z all formats provide a subclass of 151*ba8755cbSAndroid Build Coastguard Worker <code>ArchiveInputStream</code> that can be used to create an 152*ba8755cbSAndroid Build Coastguard Worker archive. For 7z <code>SevenZFile</code> provides a similar API 153*ba8755cbSAndroid Build Coastguard Worker that does not represent a stream as our implementation 154*ba8755cbSAndroid Build Coastguard Worker requires random access to the input and cannot be used for 155*ba8755cbSAndroid Build Coastguard Worker general streams. The ZIP implementation can benefit a lot from 156*ba8755cbSAndroid Build Coastguard Worker random access as well, see the <a 157*ba8755cbSAndroid Build Coastguard Worker href="zip.html#ZipArchiveInputStream_vs_ZipFile">zip 158*ba8755cbSAndroid Build Coastguard Worker page</a> for details.</p> 159*ba8755cbSAndroid Build Coastguard Worker 160*ba8755cbSAndroid Build Coastguard Worker <p>Assuming you want to extract an archive to a target 161*ba8755cbSAndroid Build Coastguard Worker directory you'd call <code>getNextEntry</code>, verify the 162*ba8755cbSAndroid Build Coastguard Worker entry can be read, construct a sane file name from the entry's 163*ba8755cbSAndroid Build Coastguard Worker name, create a <codee>File</codee> and write all contents to 164*ba8755cbSAndroid Build Coastguard Worker it - here <code>IOUtils.copy</code> may come handy. You do so 165*ba8755cbSAndroid Build Coastguard Worker for every entry until <code>getNextEntry</code> returns 166*ba8755cbSAndroid Build Coastguard Worker <code>null</code>.</p> 167*ba8755cbSAndroid Build Coastguard Worker 168*ba8755cbSAndroid Build Coastguard Worker <p>A skeleton might look like:</p> 169*ba8755cbSAndroid Build Coastguard Worker 170*ba8755cbSAndroid Build Coastguard Worker <source><![CDATA[ 171*ba8755cbSAndroid Build Coastguard WorkerFile targetDir = ... 172*ba8755cbSAndroid Build Coastguard Workertry (ArchiveInputStream i = ... create the stream for your format, use buffering...) { 173*ba8755cbSAndroid Build Coastguard Worker ArchiveEntry entry = null; 174*ba8755cbSAndroid Build Coastguard Worker while ((entry = i.getNextEntry()) != null) { 175*ba8755cbSAndroid Build Coastguard Worker if (!i.canReadEntryData(entry)) { 176*ba8755cbSAndroid Build Coastguard Worker // log something? 177*ba8755cbSAndroid Build Coastguard Worker continue; 178*ba8755cbSAndroid Build Coastguard Worker } 179*ba8755cbSAndroid Build Coastguard Worker String name = fileName(targetDir, entry); 180*ba8755cbSAndroid Build Coastguard Worker File f = new File(name); 181*ba8755cbSAndroid Build Coastguard Worker if (entry.isDirectory()) { 182*ba8755cbSAndroid Build Coastguard Worker if (!f.isDirectory() && !f.mkdirs()) { 183*ba8755cbSAndroid Build Coastguard Worker throw new IOException("failed to create directory " + f); 184*ba8755cbSAndroid Build Coastguard Worker } 185*ba8755cbSAndroid Build Coastguard Worker } else { 186*ba8755cbSAndroid Build Coastguard Worker File parent = f.getParentFile(); 187*ba8755cbSAndroid Build Coastguard Worker if (!parent.isDirectory() && !parent.mkdirs()) { 188*ba8755cbSAndroid Build Coastguard Worker throw new IOException("failed to create directory " + parent); 189*ba8755cbSAndroid Build Coastguard Worker } 190*ba8755cbSAndroid Build Coastguard Worker try (OutputStream o = Files.newOutputStream(f.toPath())) { 191*ba8755cbSAndroid Build Coastguard Worker IOUtils.copy(i, o); 192*ba8755cbSAndroid Build Coastguard Worker } 193*ba8755cbSAndroid Build Coastguard Worker } 194*ba8755cbSAndroid Build Coastguard Worker } 195*ba8755cbSAndroid Build Coastguard Worker} 196*ba8755cbSAndroid Build Coastguard Worker]]></source> 197*ba8755cbSAndroid Build Coastguard Worker 198*ba8755cbSAndroid Build Coastguard Worker <p>where the hypothetical <code>fileName</code> method is 199*ba8755cbSAndroid Build Coastguard Worker written by you and provides the absolute name for the file 200*ba8755cbSAndroid Build Coastguard Worker that is going to be written on disk. Here you should perform 201*ba8755cbSAndroid Build Coastguard Worker checks that ensure the resulting file name actually is a valid 202*ba8755cbSAndroid Build Coastguard Worker file name on your operating system or belongs to a file inside 203*ba8755cbSAndroid Build Coastguard Worker of <code>targetDir</code> when using the entry's name as 204*ba8755cbSAndroid Build Coastguard Worker input.</p> 205*ba8755cbSAndroid Build Coastguard Worker 206*ba8755cbSAndroid Build Coastguard Worker <p>If you want to combine an archive format with a compression 207*ba8755cbSAndroid Build Coastguard Worker format - like when reading a "tar.gz" file - you wrap the 208*ba8755cbSAndroid Build Coastguard Worker <code>ArchiveInputStream</code> around 209*ba8755cbSAndroid Build Coastguard Worker <code>CompressorInputStream</code> for example:</p> 210*ba8755cbSAndroid Build Coastguard Worker 211*ba8755cbSAndroid Build Coastguard Worker <source><![CDATA[ 212*ba8755cbSAndroid Build Coastguard Workertry (InputStream fi = Files.newInputStream(Paths.get("my.tar.gz")); 213*ba8755cbSAndroid Build Coastguard Worker InputStream bi = new BufferedInputStream(fi); 214*ba8755cbSAndroid Build Coastguard Worker InputStream gzi = new GzipCompressorInputStream(bi); 215*ba8755cbSAndroid Build Coastguard Worker ArchiveInputStream o = new TarArchiveInputStream(gzi)) { 216*ba8755cbSAndroid Build Coastguard Worker} 217*ba8755cbSAndroid Build Coastguard Worker]]></source> 218*ba8755cbSAndroid Build Coastguard Worker 219*ba8755cbSAndroid Build Coastguard Worker </subsection> 220*ba8755cbSAndroid Build Coastguard Worker 221*ba8755cbSAndroid Build Coastguard Worker <subsection name="Common Archival Logic"> 222*ba8755cbSAndroid Build Coastguard Worker <p>Apart from 7z all formats that support writing provide a 223*ba8755cbSAndroid Build Coastguard Worker subclass of <code>ArchiveOutputStream</code> that can be used 224*ba8755cbSAndroid Build Coastguard Worker to create an archive. For 7z <code>SevenZOutputFile</code> 225*ba8755cbSAndroid Build Coastguard Worker provides a similar API that does not represent a stream as our 226*ba8755cbSAndroid Build Coastguard Worker implementation requires random access to the output and cannot 227*ba8755cbSAndroid Build Coastguard Worker be used for general streams. The 228*ba8755cbSAndroid Build Coastguard Worker <code>ZipArchiveOutputStream</code> class will benefit from 229*ba8755cbSAndroid Build Coastguard Worker random access as well but can be used for non-seekable streams 230*ba8755cbSAndroid Build Coastguard Worker - but not all features will be available and the archive size 231*ba8755cbSAndroid Build Coastguard Worker might be slightly bigger, see <a 232*ba8755cbSAndroid Build Coastguard Worker href="zip.html#ZipArchiveOutputStream">the zip page</a> for 233*ba8755cbSAndroid Build Coastguard Worker details.</p> 234*ba8755cbSAndroid Build Coastguard Worker 235*ba8755cbSAndroid Build Coastguard Worker <p>Assuming you want to add a collection of files to an 236*ba8755cbSAndroid Build Coastguard Worker archive, you can first use <code>createArchiveEntry</code> for 237*ba8755cbSAndroid Build Coastguard Worker each file. In general this will set a few flags (usually the 238*ba8755cbSAndroid Build Coastguard Worker last modified time, the size and the information whether this 239*ba8755cbSAndroid Build Coastguard Worker is a file or directory) based on the <code>File</code> 240*ba8755cbSAndroid Build Coastguard Worker instance. Alternatively you can create the 241*ba8755cbSAndroid Build Coastguard Worker <code>ArchiveEntry</code> subclass corresponding to your 242*ba8755cbSAndroid Build Coastguard Worker format directly. Often you may want to set additional flags 243*ba8755cbSAndroid Build Coastguard Worker like file permissions or owner information before adding the 244*ba8755cbSAndroid Build Coastguard Worker entry to the archive.</p> 245*ba8755cbSAndroid Build Coastguard Worker 246*ba8755cbSAndroid Build Coastguard Worker <p>Next you use <code>putArchiveEntry</code> in order to add 247*ba8755cbSAndroid Build Coastguard Worker the entry and then start using <code>write</code> to add the 248*ba8755cbSAndroid Build Coastguard Worker content of the entry - here <code>IOUtils.copy</code> may 249*ba8755cbSAndroid Build Coastguard Worker come handy. Finally you invoke 250*ba8755cbSAndroid Build Coastguard Worker <code>closeArchiveEntry</code> once you've written all content 251*ba8755cbSAndroid Build Coastguard Worker and before you add the next entry.</p> 252*ba8755cbSAndroid Build Coastguard Worker 253*ba8755cbSAndroid Build Coastguard Worker <p>Once all entries have been added you'd invoke 254*ba8755cbSAndroid Build Coastguard Worker <code>finish</code> and finally <code>close</code> the 255*ba8755cbSAndroid Build Coastguard Worker stream.</p> 256*ba8755cbSAndroid Build Coastguard Worker 257*ba8755cbSAndroid Build Coastguard Worker <p>A skeleton might look like:</p> 258*ba8755cbSAndroid Build Coastguard Worker 259*ba8755cbSAndroid Build Coastguard Worker <source><![CDATA[ 260*ba8755cbSAndroid Build Coastguard WorkerCollection<File> filesToArchive = ... 261*ba8755cbSAndroid Build Coastguard Workertry (ArchiveOutputStream o = ... create the stream for your format ...) { 262*ba8755cbSAndroid Build Coastguard Worker for (File f : filesToArchive) { 263*ba8755cbSAndroid Build Coastguard Worker // maybe skip directories for formats like AR that don't store directories 264*ba8755cbSAndroid Build Coastguard Worker ArchiveEntry entry = o.createArchiveEntry(f, entryName(f)); 265*ba8755cbSAndroid Build Coastguard Worker // potentially add more flags to entry 266*ba8755cbSAndroid Build Coastguard Worker o.putArchiveEntry(entry); 267*ba8755cbSAndroid Build Coastguard Worker if (f.isFile()) { 268*ba8755cbSAndroid Build Coastguard Worker try (InputStream i = Files.newInputStream(f.toPath())) { 269*ba8755cbSAndroid Build Coastguard Worker IOUtils.copy(i, o); 270*ba8755cbSAndroid Build Coastguard Worker } 271*ba8755cbSAndroid Build Coastguard Worker } 272*ba8755cbSAndroid Build Coastguard Worker o.closeArchiveEntry(); 273*ba8755cbSAndroid Build Coastguard Worker } 274*ba8755cbSAndroid Build Coastguard Worker out.finish(); 275*ba8755cbSAndroid Build Coastguard Worker} 276*ba8755cbSAndroid Build Coastguard Worker]]></source> 277*ba8755cbSAndroid Build Coastguard Worker 278*ba8755cbSAndroid Build Coastguard Worker <p>where the hypothetical <code>entryName</code> method is 279*ba8755cbSAndroid Build Coastguard Worker written by you and provides the name for the entry as it is 280*ba8755cbSAndroid Build Coastguard Worker going to be written to the archive.</p> 281*ba8755cbSAndroid Build Coastguard Worker 282*ba8755cbSAndroid Build Coastguard Worker <p>If you want to combine an archive format with a compression 283*ba8755cbSAndroid Build Coastguard Worker format - like when creating a "tar.gz" file - you wrap the 284*ba8755cbSAndroid Build Coastguard Worker <code>ArchiveOutputStream</code> around a 285*ba8755cbSAndroid Build Coastguard Worker <code>CompressorOutputStream</code> for example:</p> 286*ba8755cbSAndroid Build Coastguard Worker 287*ba8755cbSAndroid Build Coastguard Worker <source><![CDATA[ 288*ba8755cbSAndroid Build Coastguard Workertry (OutputStream fo = Files.newOutputStream(Paths.get("my.tar.gz")); 289*ba8755cbSAndroid Build Coastguard Worker OutputStream gzo = new GzipCompressorOutputStream(fo); 290*ba8755cbSAndroid Build Coastguard Worker ArchiveOutputStream o = new TarArchiveOutputStream(gzo)) { 291*ba8755cbSAndroid Build Coastguard Worker} 292*ba8755cbSAndroid Build Coastguard Worker]]></source> 293*ba8755cbSAndroid Build Coastguard Worker 294*ba8755cbSAndroid Build Coastguard Worker </subsection> 295*ba8755cbSAndroid Build Coastguard Worker 296*ba8755cbSAndroid Build Coastguard Worker <subsection name="7z"> 297*ba8755cbSAndroid Build Coastguard Worker 298*ba8755cbSAndroid Build Coastguard Worker <p>Note that Commons Compress currently only supports a subset 299*ba8755cbSAndroid Build Coastguard Worker of compression and encryption algorithms used for 7z archives. 300*ba8755cbSAndroid Build Coastguard Worker For writing only uncompressed entries, LZMA, LZMA2, BZIP2 and 301*ba8755cbSAndroid Build Coastguard Worker Deflate are supported - in addition to those reading supports 302*ba8755cbSAndroid Build Coastguard Worker AES-256/SHA-256 and DEFLATE64.</p> 303*ba8755cbSAndroid Build Coastguard Worker 304*ba8755cbSAndroid Build Coastguard Worker <p>Multipart archives are not supported at all.</p> 305*ba8755cbSAndroid Build Coastguard Worker 306*ba8755cbSAndroid Build Coastguard Worker <p>7z archives can use multiple compression and encryption 307*ba8755cbSAndroid Build Coastguard Worker methods as well as filters combined as a pipeline of methods 308*ba8755cbSAndroid Build Coastguard Worker for its entries. Prior to Compress 1.8 you could only specify 309*ba8755cbSAndroid Build Coastguard Worker a single method when creating archives - reading archives 310*ba8755cbSAndroid Build Coastguard Worker using more than one method has been possible before. Starting 311*ba8755cbSAndroid Build Coastguard Worker with Compress 1.8 it is possible to configure the full 312*ba8755cbSAndroid Build Coastguard Worker pipeline using the <code>setContentMethods</code> method of 313*ba8755cbSAndroid Build Coastguard Worker <code>SevenZOutputFile</code>. Methods are specified in the 314*ba8755cbSAndroid Build Coastguard Worker order they appear inside the pipeline when creating the 315*ba8755cbSAndroid Build Coastguard Worker archive, you can also specify certain parameters for some of 316*ba8755cbSAndroid Build Coastguard Worker the methods - see the Javadocs of 317*ba8755cbSAndroid Build Coastguard Worker <code>SevenZMethodConfiguration</code> for details.</p> 318*ba8755cbSAndroid Build Coastguard Worker 319*ba8755cbSAndroid Build Coastguard Worker <p>When reading entries from an archive the 320*ba8755cbSAndroid Build Coastguard Worker <code>getContentMethods</code> method of 321*ba8755cbSAndroid Build Coastguard Worker <code>SevenZArchiveEntry</code> will properly represent the 322*ba8755cbSAndroid Build Coastguard Worker compression/encryption/filter methods but may fail to 323*ba8755cbSAndroid Build Coastguard Worker determine the configuration options used. As of Compress 1.8 324*ba8755cbSAndroid Build Coastguard Worker only the dictionary size used for LZMA2 can be read.</p> 325*ba8755cbSAndroid Build Coastguard Worker 326*ba8755cbSAndroid Build Coastguard Worker <p>Currently solid compression - compressing multiple files 327*ba8755cbSAndroid Build Coastguard Worker as a single block to benefit from patterns repeating accross 328*ba8755cbSAndroid Build Coastguard Worker files - is only supported when reading archives. This also 329*ba8755cbSAndroid Build Coastguard Worker means compression ratio will likely be worse when using 330*ba8755cbSAndroid Build Coastguard Worker Commons Compress compared to the native 7z executable.</p> 331*ba8755cbSAndroid Build Coastguard Worker 332*ba8755cbSAndroid Build Coastguard Worker <p>Reading or writing requires a 333*ba8755cbSAndroid Build Coastguard Worker <code>SeekableByteChannel</code> that will be obtained 334*ba8755cbSAndroid Build Coastguard Worker transparently when reading from or writing to a file. The 335*ba8755cbSAndroid Build Coastguard Worker class 336*ba8755cbSAndroid Build Coastguard Worker <code>org.apache.commons.compress.utils.SeekableInMemoryByteChannel</code> 337*ba8755cbSAndroid Build Coastguard Worker allows you to read from or write to an in-memory archive.</p> 338*ba8755cbSAndroid Build Coastguard Worker 339*ba8755cbSAndroid Build Coastguard Worker <p>Adding an entry to a 7z archive:</p> 340*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 341*ba8755cbSAndroid Build Coastguard WorkerSevenZOutputFile sevenZOutput = new SevenZOutputFile(file); 342*ba8755cbSAndroid Build Coastguard WorkerSevenZArchiveEntry entry = sevenZOutput.createArchiveEntry(fileToArchive, name); 343*ba8755cbSAndroid Build Coastguard WorkersevenZOutput.putArchiveEntry(entry); 344*ba8755cbSAndroid Build Coastguard WorkersevenZOutput.write(contentOfEntry); 345*ba8755cbSAndroid Build Coastguard WorkersevenZOutput.closeArchiveEntry(); 346*ba8755cbSAndroid Build Coastguard Worker]]></source> 347*ba8755cbSAndroid Build Coastguard Worker 348*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given 7z archive (you would 349*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 350*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 351*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 352*ba8755cbSAndroid Build Coastguard WorkerSevenZFile sevenZFile = new SevenZFile(new File("archive.7z")); 353*ba8755cbSAndroid Build Coastguard WorkerSevenZArchiveEntry entry = sevenZFile.getNextEntry(); 354*ba8755cbSAndroid Build Coastguard Workerbyte[] content = new byte[entry.getSize()]; 355*ba8755cbSAndroid Build Coastguard WorkerLOOP UNTIL entry.getSize() HAS BEEN READ { 356*ba8755cbSAndroid Build Coastguard Worker sevenZFile.read(content, offset, content.length - offset); 357*ba8755cbSAndroid Build Coastguard Worker} 358*ba8755cbSAndroid Build Coastguard Worker]]></source> 359*ba8755cbSAndroid Build Coastguard Worker 360*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given in-memory 7z archive:</p> 361*ba8755cbSAndroid Build Coastguard Worker <source><![CDATA[ 362*ba8755cbSAndroid Build Coastguard Workerbyte[] inputData; // 7z archive contents 363*ba8755cbSAndroid Build Coastguard WorkerSeekableInMemoryByteChannel inMemoryByteChannel = new SeekableInMemoryByteChannel(inputData); 364*ba8755cbSAndroid Build Coastguard WorkerSevenZFile sevenZFile = new SevenZFile(inMemoryByteChannel); 365*ba8755cbSAndroid Build Coastguard WorkerSevenZArchiveEntry entry = sevenZFile.getNextEntry(); 366*ba8755cbSAndroid Build Coastguard WorkersevenZFile.read(); // read current entry's data 367*ba8755cbSAndroid Build Coastguard Worker]]></source> 368*ba8755cbSAndroid Build Coastguard Worker 369*ba8755cbSAndroid Build Coastguard Worker <h4><a name="Encrypted 7z Archives"></a>Encrypted 7z Archives</h4> 370*ba8755cbSAndroid Build Coastguard Worker 371*ba8755cbSAndroid Build Coastguard Worker <p>Currently Compress supports reading but not writing of 372*ba8755cbSAndroid Build Coastguard Worker encrypted archives. When reading an encrypted archive a 373*ba8755cbSAndroid Build Coastguard Worker password has to be provided to one of 374*ba8755cbSAndroid Build Coastguard Worker <code>SevenZFile</code>'s constructors. If you try to read 375*ba8755cbSAndroid Build Coastguard Worker an encrypted archive without specifying a password a 376*ba8755cbSAndroid Build Coastguard Worker <code>PasswordRequiredException</code> (a subclass of 377*ba8755cbSAndroid Build Coastguard Worker <code>IOException</code>) will be thrown.</p> 378*ba8755cbSAndroid Build Coastguard Worker 379*ba8755cbSAndroid Build Coastguard Worker <p>When specifying the password as a <code>byte[]</code> one 380*ba8755cbSAndroid Build Coastguard Worker common mistake is to use the wrong encoding when creating 381*ba8755cbSAndroid Build Coastguard Worker the <code>byte[]</code> from a <code>String</code>. The 382*ba8755cbSAndroid Build Coastguard Worker <code>SevenZFile</code> class expects the bytes to 383*ba8755cbSAndroid Build Coastguard Worker correspond to the UTF16-LE encoding of the password. An 384*ba8755cbSAndroid Build Coastguard Worker example of reading an encrypted archive is</p> 385*ba8755cbSAndroid Build Coastguard Worker 386*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 387*ba8755cbSAndroid Build Coastguard WorkerSevenZFile sevenZFile = new SevenZFile(new File("archive.7z"), "secret".getBytes(StandardCharsets.UTF_16LE)); 388*ba8755cbSAndroid Build Coastguard WorkerSevenZArchiveEntry entry = sevenZFile.getNextEntry(); 389*ba8755cbSAndroid Build Coastguard Workerbyte[] content = new byte[entry.getSize()]; 390*ba8755cbSAndroid Build Coastguard WorkerLOOP UNTIL entry.getSize() HAS BEEN READ { 391*ba8755cbSAndroid Build Coastguard Worker sevenZFile.read(content, offset, content.length - offset); 392*ba8755cbSAndroid Build Coastguard Worker} 393*ba8755cbSAndroid Build Coastguard Worker]]></source> 394*ba8755cbSAndroid Build Coastguard Worker 395*ba8755cbSAndroid Build Coastguard Worker <p>Starting with Compress 1.17 new constructors have been 396*ba8755cbSAndroid Build Coastguard Worker added that accept the password as <code>char[]</code> rather 397*ba8755cbSAndroid Build Coastguard Worker than a <code>byte[]</code>. We recommend you use these in 398*ba8755cbSAndroid Build Coastguard Worker order to avoid the problem above.</p> 399*ba8755cbSAndroid Build Coastguard Worker 400*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 401*ba8755cbSAndroid Build Coastguard WorkerSevenZFile sevenZFile = new SevenZFile(new File("archive.7z"), "secret".toCharArray()); 402*ba8755cbSAndroid Build Coastguard WorkerSevenZArchiveEntry entry = sevenZFile.getNextEntry(); 403*ba8755cbSAndroid Build Coastguard Workerbyte[] content = new byte[entry.getSize()]; 404*ba8755cbSAndroid Build Coastguard WorkerLOOP UNTIL entry.getSize() HAS BEEN READ { 405*ba8755cbSAndroid Build Coastguard Worker sevenZFile.read(content, offset, content.length - offset); 406*ba8755cbSAndroid Build Coastguard Worker} 407*ba8755cbSAndroid Build Coastguard Worker]]></source> 408*ba8755cbSAndroid Build Coastguard Worker 409*ba8755cbSAndroid Build Coastguard Worker </subsection> 410*ba8755cbSAndroid Build Coastguard Worker 411*ba8755cbSAndroid Build Coastguard Worker <subsection name="ar"> 412*ba8755cbSAndroid Build Coastguard Worker 413*ba8755cbSAndroid Build Coastguard Worker <p>In addition to the information stored 414*ba8755cbSAndroid Build Coastguard Worker in <code>ArchiveEntry</code> a <code>ArArchiveEntry</code> 415*ba8755cbSAndroid Build Coastguard Worker stores information about the owner user and group as well as 416*ba8755cbSAndroid Build Coastguard Worker Unix permissions.</p> 417*ba8755cbSAndroid Build Coastguard Worker 418*ba8755cbSAndroid Build Coastguard Worker <p>Adding an entry to an ar archive:</p> 419*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 420*ba8755cbSAndroid Build Coastguard WorkerArArchiveEntry entry = new ArArchiveEntry(name, size); 421*ba8755cbSAndroid Build Coastguard WorkerarOutput.putArchiveEntry(entry); 422*ba8755cbSAndroid Build Coastguard WorkerarOutput.write(contentOfEntry); 423*ba8755cbSAndroid Build Coastguard WorkerarOutput.closeArchiveEntry(); 424*ba8755cbSAndroid Build Coastguard Worker]]></source> 425*ba8755cbSAndroid Build Coastguard Worker 426*ba8755cbSAndroid Build Coastguard Worker <p>Reading entries from an ar archive:</p> 427*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 428*ba8755cbSAndroid Build Coastguard WorkerArArchiveEntry entry = (ArArchiveEntry) arInput.getNextEntry(); 429*ba8755cbSAndroid Build Coastguard Workerbyte[] content = new byte[entry.getSize()]; 430*ba8755cbSAndroid Build Coastguard WorkerLOOP UNTIL entry.getSize() HAS BEEN READ { 431*ba8755cbSAndroid Build Coastguard Worker arInput.read(content, offset, content.length - offset); 432*ba8755cbSAndroid Build Coastguard Worker} 433*ba8755cbSAndroid Build Coastguard Worker]]></source> 434*ba8755cbSAndroid Build Coastguard Worker 435*ba8755cbSAndroid Build Coastguard Worker <p>Traditionally the AR format doesn't allow file names longer 436*ba8755cbSAndroid Build Coastguard Worker than 16 characters. There are two variants that circumvent 437*ba8755cbSAndroid Build Coastguard Worker this limitation in different ways, the GNU/SRV4 and the BSD 438*ba8755cbSAndroid Build Coastguard Worker variant. Commons Compress 1.0 to 1.2 can only read archives 439*ba8755cbSAndroid Build Coastguard Worker using the GNU/SRV4 variant, support for the BSD variant has 440*ba8755cbSAndroid Build Coastguard Worker been added in Commons Compress 1.3. Commons Compress 1.3 441*ba8755cbSAndroid Build Coastguard Worker also optionally supports writing archives with file names 442*ba8755cbSAndroid Build Coastguard Worker longer than 16 characters using the BSD dialect, writing 443*ba8755cbSAndroid Build Coastguard Worker the SVR4/GNU dialect is not supported.</p> 444*ba8755cbSAndroid Build Coastguard Worker 445*ba8755cbSAndroid Build Coastguard Worker <table> 446*ba8755cbSAndroid Build Coastguard Worker <thead> 447*ba8755cbSAndroid Build Coastguard Worker <tr> 448*ba8755cbSAndroid Build Coastguard Worker <th>Version of Apache Commons Compress</th> 449*ba8755cbSAndroid Build Coastguard Worker <th>Support for Traditional AR Format</th> 450*ba8755cbSAndroid Build Coastguard Worker <th>Support for GNU/SRV4 Dialect</th> 451*ba8755cbSAndroid Build Coastguard Worker <th>Support for BSD Dialect</th> 452*ba8755cbSAndroid Build Coastguard Worker </tr> 453*ba8755cbSAndroid Build Coastguard Worker </thead> 454*ba8755cbSAndroid Build Coastguard Worker <tbody> 455*ba8755cbSAndroid Build Coastguard Worker <tr> 456*ba8755cbSAndroid Build Coastguard Worker <td>1.0 to 1.2</td> 457*ba8755cbSAndroid Build Coastguard Worker <td>read/write</td> 458*ba8755cbSAndroid Build Coastguard Worker <td>read</td> 459*ba8755cbSAndroid Build Coastguard Worker <td>-</td> 460*ba8755cbSAndroid Build Coastguard Worker </tr> 461*ba8755cbSAndroid Build Coastguard Worker <tr> 462*ba8755cbSAndroid Build Coastguard Worker <td>1.3 and later</td> 463*ba8755cbSAndroid Build Coastguard Worker <td>read/write</td> 464*ba8755cbSAndroid Build Coastguard Worker <td>read</td> 465*ba8755cbSAndroid Build Coastguard Worker <td>read/write</td> 466*ba8755cbSAndroid Build Coastguard Worker </tr> 467*ba8755cbSAndroid Build Coastguard Worker </tbody> 468*ba8755cbSAndroid Build Coastguard Worker </table> 469*ba8755cbSAndroid Build Coastguard Worker 470*ba8755cbSAndroid Build Coastguard Worker <p>It is not possible to detect the end of an AR archive in a 471*ba8755cbSAndroid Build Coastguard Worker reliable way so <code>ArArchiveInputStream</code> will read 472*ba8755cbSAndroid Build Coastguard Worker until it reaches the end of the stream or fails to parse the 473*ba8755cbSAndroid Build Coastguard Worker stream's content as AR entries.</p> 474*ba8755cbSAndroid Build Coastguard Worker 475*ba8755cbSAndroid Build Coastguard Worker </subsection> 476*ba8755cbSAndroid Build Coastguard Worker 477*ba8755cbSAndroid Build Coastguard Worker <subsection name="arj"> 478*ba8755cbSAndroid Build Coastguard Worker 479*ba8755cbSAndroid Build Coastguard Worker <p>Note that Commons Compress doesn't support compressed, 480*ba8755cbSAndroid Build Coastguard Worker encrypted or multi-volume ARJ archives, yet.</p> 481*ba8755cbSAndroid Build Coastguard Worker 482*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given arj archive (you would 483*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 484*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 485*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 486*ba8755cbSAndroid Build Coastguard WorkerArjArchiveEntry entry = arjInput.getNextEntry(); 487*ba8755cbSAndroid Build Coastguard Workerbyte[] content = new byte[entry.getSize()]; 488*ba8755cbSAndroid Build Coastguard WorkerLOOP UNTIL entry.getSize() HAS BEEN READ { 489*ba8755cbSAndroid Build Coastguard Worker arjInput.read(content, offset, content.length - offset); 490*ba8755cbSAndroid Build Coastguard Worker} 491*ba8755cbSAndroid Build Coastguard Worker]]></source> 492*ba8755cbSAndroid Build Coastguard Worker </subsection> 493*ba8755cbSAndroid Build Coastguard Worker 494*ba8755cbSAndroid Build Coastguard Worker <subsection name="cpio"> 495*ba8755cbSAndroid Build Coastguard Worker 496*ba8755cbSAndroid Build Coastguard Worker <p>In addition to the information stored 497*ba8755cbSAndroid Build Coastguard Worker in <code>ArchiveEntry</code> a <code>CpioArchiveEntry</code> 498*ba8755cbSAndroid Build Coastguard Worker stores various attributes including information about the 499*ba8755cbSAndroid Build Coastguard Worker original owner and permissions.</p> 500*ba8755cbSAndroid Build Coastguard Worker 501*ba8755cbSAndroid Build Coastguard Worker <p>The cpio package supports the "new portable" as well as the 502*ba8755cbSAndroid Build Coastguard Worker "old" format of CPIO archives in their binary, ASCII and 503*ba8755cbSAndroid Build Coastguard Worker "with CRC" variants.</p> 504*ba8755cbSAndroid Build Coastguard Worker 505*ba8755cbSAndroid Build Coastguard Worker <p>Adding an entry to a cpio archive:</p> 506*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 507*ba8755cbSAndroid Build Coastguard WorkerCpioArchiveEntry entry = new CpioArchiveEntry(name, size); 508*ba8755cbSAndroid Build Coastguard WorkercpioOutput.putArchiveEntry(entry); 509*ba8755cbSAndroid Build Coastguard WorkercpioOutput.write(contentOfEntry); 510*ba8755cbSAndroid Build Coastguard WorkercpioOutput.closeArchiveEntry(); 511*ba8755cbSAndroid Build Coastguard Worker]]></source> 512*ba8755cbSAndroid Build Coastguard Worker 513*ba8755cbSAndroid Build Coastguard Worker <p>Reading entries from an cpio archive:</p> 514*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 515*ba8755cbSAndroid Build Coastguard WorkerCpioArchiveEntry entry = cpioInput.getNextCPIOEntry(); 516*ba8755cbSAndroid Build Coastguard Workerbyte[] content = new byte[entry.getSize()]; 517*ba8755cbSAndroid Build Coastguard WorkerLOOP UNTIL entry.getSize() HAS BEEN READ { 518*ba8755cbSAndroid Build Coastguard Worker cpioInput.read(content, offset, content.length - offset); 519*ba8755cbSAndroid Build Coastguard Worker} 520*ba8755cbSAndroid Build Coastguard Worker]]></source> 521*ba8755cbSAndroid Build Coastguard Worker 522*ba8755cbSAndroid Build Coastguard Worker <p>Traditionally CPIO archives are written in blocks of 512 523*ba8755cbSAndroid Build Coastguard Worker bytes - the block size is a configuration parameter of the 524*ba8755cbSAndroid Build Coastguard Worker <code>Cpio*Stream</code>'s constuctors. Starting with version 525*ba8755cbSAndroid Build Coastguard Worker 1.5 <code>CpioArchiveInputStream</code> will consume the 526*ba8755cbSAndroid Build Coastguard Worker padding written to fill the current block when the end of the 527*ba8755cbSAndroid Build Coastguard Worker archive is reached. Unfortunately many CPIO implementations 528*ba8755cbSAndroid Build Coastguard Worker use larger block sizes so there may be more zero-byte padding 529*ba8755cbSAndroid Build Coastguard Worker left inside the original input stream after the archive has 530*ba8755cbSAndroid Build Coastguard Worker been consumed completely.</p> 531*ba8755cbSAndroid Build Coastguard Worker 532*ba8755cbSAndroid Build Coastguard Worker </subsection> 533*ba8755cbSAndroid Build Coastguard Worker 534*ba8755cbSAndroid Build Coastguard Worker <subsection name="jar"> 535*ba8755cbSAndroid Build Coastguard Worker <p>In general, JAR archives are ZIP files, so the JAR package 536*ba8755cbSAndroid Build Coastguard Worker supports all options provided by the <a href="#zip">ZIP</a> package.</p> 537*ba8755cbSAndroid Build Coastguard Worker 538*ba8755cbSAndroid Build Coastguard Worker <p>To be interoperable JAR archives should always be created 539*ba8755cbSAndroid Build Coastguard Worker using the UTF-8 encoding for file names (which is the 540*ba8755cbSAndroid Build Coastguard Worker default).</p> 541*ba8755cbSAndroid Build Coastguard Worker 542*ba8755cbSAndroid Build Coastguard Worker <p>Archives created using <code>JarArchiveOutputStream</code> 543*ba8755cbSAndroid Build Coastguard Worker will implicitly add a <code>JarMarker</code> extra field to 544*ba8755cbSAndroid Build Coastguard Worker the very first archive entry of the archive which will make 545*ba8755cbSAndroid Build Coastguard Worker Solaris recognize them as Java archives and allows them to 546*ba8755cbSAndroid Build Coastguard Worker be used as executables.</p> 547*ba8755cbSAndroid Build Coastguard Worker 548*ba8755cbSAndroid Build Coastguard Worker <p>Note that <code>ArchiveStreamFactory</code> doesn't 549*ba8755cbSAndroid Build Coastguard Worker distinguish ZIP archives from JAR archives, so if you use 550*ba8755cbSAndroid Build Coastguard Worker the one-argument <code>createArchiveInputStream</code> 551*ba8755cbSAndroid Build Coastguard Worker method on a JAR archive, it will still return the more 552*ba8755cbSAndroid Build Coastguard Worker generic <code>ZipArchiveInputStream</code>.</p> 553*ba8755cbSAndroid Build Coastguard Worker 554*ba8755cbSAndroid Build Coastguard Worker <p>The <code>JarArchiveEntry</code> class contains fields for 555*ba8755cbSAndroid Build Coastguard Worker certificates and attributes that are planned to be supported 556*ba8755cbSAndroid Build Coastguard Worker in the future but are not supported as of Compress 1.0.</p> 557*ba8755cbSAndroid Build Coastguard Worker 558*ba8755cbSAndroid Build Coastguard Worker <p>Adding an entry to a jar archive:</p> 559*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 560*ba8755cbSAndroid Build Coastguard WorkerJarArchiveEntry entry = new JarArchiveEntry(name, size); 561*ba8755cbSAndroid Build Coastguard Workerentry.setSize(size); 562*ba8755cbSAndroid Build Coastguard WorkerjarOutput.putArchiveEntry(entry); 563*ba8755cbSAndroid Build Coastguard WorkerjarOutput.write(contentOfEntry); 564*ba8755cbSAndroid Build Coastguard WorkerjarOutput.closeArchiveEntry(); 565*ba8755cbSAndroid Build Coastguard Worker]]></source> 566*ba8755cbSAndroid Build Coastguard Worker 567*ba8755cbSAndroid Build Coastguard Worker <p>Reading entries from an jar archive:</p> 568*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 569*ba8755cbSAndroid Build Coastguard WorkerJarArchiveEntry entry = jarInput.getNextJarEntry(); 570*ba8755cbSAndroid Build Coastguard Workerbyte[] content = new byte[entry.getSize()]; 571*ba8755cbSAndroid Build Coastguard WorkerLOOP UNTIL entry.getSize() HAS BEEN READ { 572*ba8755cbSAndroid Build Coastguard Worker jarInput.read(content, offset, content.length - offset); 573*ba8755cbSAndroid Build Coastguard Worker} 574*ba8755cbSAndroid Build Coastguard Worker]]></source> 575*ba8755cbSAndroid Build Coastguard Worker </subsection> 576*ba8755cbSAndroid Build Coastguard Worker 577*ba8755cbSAndroid Build Coastguard Worker <subsection name="dump"> 578*ba8755cbSAndroid Build Coastguard Worker 579*ba8755cbSAndroid Build Coastguard Worker <p>In addition to the information stored 580*ba8755cbSAndroid Build Coastguard Worker in <code>ArchiveEntry</code> a <code>DumpArchiveEntry</code> 581*ba8755cbSAndroid Build Coastguard Worker stores various attributes including information about the 582*ba8755cbSAndroid Build Coastguard Worker original owner and permissions.</p> 583*ba8755cbSAndroid Build Coastguard Worker 584*ba8755cbSAndroid Build Coastguard Worker <p>As of Commons Compress 1.3 only dump archives using the 585*ba8755cbSAndroid Build Coastguard Worker new-fs format - this is the most common variant - are 586*ba8755cbSAndroid Build Coastguard Worker supported. Right now this library supports uncompressed and 587*ba8755cbSAndroid Build Coastguard Worker ZLIB compressed archives and can not write archives at 588*ba8755cbSAndroid Build Coastguard Worker all.</p> 589*ba8755cbSAndroid Build Coastguard Worker 590*ba8755cbSAndroid Build Coastguard Worker <p>Reading entries from an dump archive:</p> 591*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 592*ba8755cbSAndroid Build Coastguard WorkerDumpArchiveEntry entry = dumpInput.getNextDumpEntry(); 593*ba8755cbSAndroid Build Coastguard Workerbyte[] content = new byte[entry.getSize()]; 594*ba8755cbSAndroid Build Coastguard WorkerLOOP UNTIL entry.getSize() HAS BEEN READ { 595*ba8755cbSAndroid Build Coastguard Worker dumpInput.read(content, offset, content.length - offset); 596*ba8755cbSAndroid Build Coastguard Worker} 597*ba8755cbSAndroid Build Coastguard Worker]]></source> 598*ba8755cbSAndroid Build Coastguard Worker 599*ba8755cbSAndroid Build Coastguard Worker <p>Prior to version 1.5 <code>DumpArchiveInputStream</code> 600*ba8755cbSAndroid Build Coastguard Worker would close the original input once it had read the last 601*ba8755cbSAndroid Build Coastguard Worker record. Starting with version 1.5 it will not close the 602*ba8755cbSAndroid Build Coastguard Worker stream implicitly.</p> 603*ba8755cbSAndroid Build Coastguard Worker 604*ba8755cbSAndroid Build Coastguard Worker </subsection> 605*ba8755cbSAndroid Build Coastguard Worker 606*ba8755cbSAndroid Build Coastguard Worker <subsection name="tar"> 607*ba8755cbSAndroid Build Coastguard Worker 608*ba8755cbSAndroid Build Coastguard Worker <p>The TAR package has a <a href="tar.html">dedicated 609*ba8755cbSAndroid Build Coastguard Worker documentation page</a>.</p> 610*ba8755cbSAndroid Build Coastguard Worker 611*ba8755cbSAndroid Build Coastguard Worker <p>Adding an entry to a tar archive:</p> 612*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 613*ba8755cbSAndroid Build Coastguard WorkerTarArchiveEntry entry = new TarArchiveEntry(name); 614*ba8755cbSAndroid Build Coastguard Workerentry.setSize(size); 615*ba8755cbSAndroid Build Coastguard WorkertarOutput.putArchiveEntry(entry); 616*ba8755cbSAndroid Build Coastguard WorkertarOutput.write(contentOfEntry); 617*ba8755cbSAndroid Build Coastguard WorkertarOutput.closeArchiveEntry(); 618*ba8755cbSAndroid Build Coastguard Worker]]></source> 619*ba8755cbSAndroid Build Coastguard Worker 620*ba8755cbSAndroid Build Coastguard Worker <p>Reading entries from an tar archive:</p> 621*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 622*ba8755cbSAndroid Build Coastguard WorkerTarArchiveEntry entry = tarInput.getNextTarEntry(); 623*ba8755cbSAndroid Build Coastguard Workerbyte[] content = new byte[entry.getSize()]; 624*ba8755cbSAndroid Build Coastguard WorkerLOOP UNTIL entry.getSize() HAS BEEN READ { 625*ba8755cbSAndroid Build Coastguard Worker tarInput.read(content, offset, content.length - offset); 626*ba8755cbSAndroid Build Coastguard Worker} 627*ba8755cbSAndroid Build Coastguard Worker]]></source> 628*ba8755cbSAndroid Build Coastguard Worker </subsection> 629*ba8755cbSAndroid Build Coastguard Worker 630*ba8755cbSAndroid Build Coastguard Worker <subsection name="zip"> 631*ba8755cbSAndroid Build Coastguard Worker <p>The ZIP package has a <a href="zip.html">dedicated 632*ba8755cbSAndroid Build Coastguard Worker documentation page</a>.</p> 633*ba8755cbSAndroid Build Coastguard Worker 634*ba8755cbSAndroid Build Coastguard Worker <p>Adding an entry to a zip archive:</p> 635*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 636*ba8755cbSAndroid Build Coastguard WorkerZipArchiveEntry entry = new ZipArchiveEntry(name); 637*ba8755cbSAndroid Build Coastguard Workerentry.setSize(size); 638*ba8755cbSAndroid Build Coastguard WorkerzipOutput.putArchiveEntry(entry); 639*ba8755cbSAndroid Build Coastguard WorkerzipOutput.write(contentOfEntry); 640*ba8755cbSAndroid Build Coastguard WorkerzipOutput.closeArchiveEntry(); 641*ba8755cbSAndroid Build Coastguard Worker]]></source> 642*ba8755cbSAndroid Build Coastguard Worker 643*ba8755cbSAndroid Build Coastguard Worker <p><code>ZipArchiveOutputStream</code> can use some internal 644*ba8755cbSAndroid Build Coastguard Worker optimizations exploiting <code>SeekableByteChannel</code> if it 645*ba8755cbSAndroid Build Coastguard Worker knows it is writing to a seekable output rather than a non-seekable 646*ba8755cbSAndroid Build Coastguard Worker stream. If you are writing to a file, you should use the 647*ba8755cbSAndroid Build Coastguard Worker constructor that accepts a <code>File</code> or 648*ba8755cbSAndroid Build Coastguard Worker <code>SeekableByteChannel</code> argument rather 649*ba8755cbSAndroid Build Coastguard Worker than the one using an <code>OutputStream</code> or the 650*ba8755cbSAndroid Build Coastguard Worker factory method in <code>ArchiveStreamFactory</code>.</p> 651*ba8755cbSAndroid Build Coastguard Worker 652*ba8755cbSAndroid Build Coastguard Worker <p>Reading entries from an zip archive:</p> 653*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 654*ba8755cbSAndroid Build Coastguard WorkerZipArchiveEntry entry = zipInput.getNextZipEntry(); 655*ba8755cbSAndroid Build Coastguard Workerbyte[] content = new byte[entry.getSize()]; 656*ba8755cbSAndroid Build Coastguard WorkerLOOP UNTIL entry.getSize() HAS BEEN READ { 657*ba8755cbSAndroid Build Coastguard Worker zipInput.read(content, offset, content.length - offset); 658*ba8755cbSAndroid Build Coastguard Worker} 659*ba8755cbSAndroid Build Coastguard Worker]]></source> 660*ba8755cbSAndroid Build Coastguard Worker 661*ba8755cbSAndroid Build Coastguard Worker <p>Reading entries from an zip archive using the 662*ba8755cbSAndroid Build Coastguard Worker recommended <code>ZipFile</code> class:</p> 663*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 664*ba8755cbSAndroid Build Coastguard WorkerZipArchiveEntry entry = zipFile.getEntry(name); 665*ba8755cbSAndroid Build Coastguard WorkerInputStream content = zipFile.getInputStream(entry); 666*ba8755cbSAndroid Build Coastguard Workertry { 667*ba8755cbSAndroid Build Coastguard Worker READ UNTIL content IS EXHAUSTED 668*ba8755cbSAndroid Build Coastguard Worker} finally { 669*ba8755cbSAndroid Build Coastguard Worker content.close(); 670*ba8755cbSAndroid Build Coastguard Worker} 671*ba8755cbSAndroid Build Coastguard Worker]]></source> 672*ba8755cbSAndroid Build Coastguard Worker 673*ba8755cbSAndroid Build Coastguard Worker <p>Reading entries from an in-memory zip archive using 674*ba8755cbSAndroid Build Coastguard Worker <code>SeekableInMemoryByteChannel</code> and <code>ZipFile</code> class:</p> 675*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 676*ba8755cbSAndroid Build Coastguard Workerbyte[] inputData; // zip archive contents 677*ba8755cbSAndroid Build Coastguard WorkerSeekableInMemoryByteChannel inMemoryByteChannel = new SeekableInMemoryByteChannel(inputData); 678*ba8755cbSAndroid Build Coastguard WorkerZipFile zipFile = new ZipFile(inMemoryByteChannel); 679*ba8755cbSAndroid Build Coastguard WorkerZipArchiveEntry archiveEntry = zipFile.getEntry("entryName"); 680*ba8755cbSAndroid Build Coastguard WorkerInputStream inputStream = zipFile.getInputStream(archiveEntry); 681*ba8755cbSAndroid Build Coastguard WorkerinputStream.read() // read data from the input stream 682*ba8755cbSAndroid Build Coastguard Worker]]></source> 683*ba8755cbSAndroid Build Coastguard Worker 684*ba8755cbSAndroid Build Coastguard Worker <p>Creating a zip file with multiple threads:</p> 685*ba8755cbSAndroid Build Coastguard Worker 686*ba8755cbSAndroid Build Coastguard Worker A simple implementation to create a zip file might look like this: 687*ba8755cbSAndroid Build Coastguard Worker 688*ba8755cbSAndroid Build Coastguard Worker<source> 689*ba8755cbSAndroid Build Coastguard Workerpublic class ScatterSample { 690*ba8755cbSAndroid Build Coastguard Worker 691*ba8755cbSAndroid Build Coastguard Worker ParallelScatterZipCreator scatterZipCreator = new ParallelScatterZipCreator(); 692*ba8755cbSAndroid Build Coastguard Worker ScatterZipOutputStream dirs = ScatterZipOutputStream.fileBased(File.createTempFile("scatter-dirs", "tmp")); 693*ba8755cbSAndroid Build Coastguard Worker 694*ba8755cbSAndroid Build Coastguard Worker public ScatterSample() throws IOException { 695*ba8755cbSAndroid Build Coastguard Worker } 696*ba8755cbSAndroid Build Coastguard Worker 697*ba8755cbSAndroid Build Coastguard Worker public void addEntry(ZipArchiveEntry zipArchiveEntry, InputStreamSupplier streamSupplier) throws IOException { 698*ba8755cbSAndroid Build Coastguard Worker if (zipArchiveEntry.isDirectory() && !zipArchiveEntry.isUnixSymlink()) 699*ba8755cbSAndroid Build Coastguard Worker dirs.addArchiveEntry(ZipArchiveEntryRequest.createZipArchiveEntryRequest(zipArchiveEntry, streamSupplier)); 700*ba8755cbSAndroid Build Coastguard Worker else 701*ba8755cbSAndroid Build Coastguard Worker scatterZipCreator.addArchiveEntry( zipArchiveEntry, streamSupplier); 702*ba8755cbSAndroid Build Coastguard Worker } 703*ba8755cbSAndroid Build Coastguard Worker 704*ba8755cbSAndroid Build Coastguard Worker public void writeTo(ZipArchiveOutputStream zipArchiveOutputStream) 705*ba8755cbSAndroid Build Coastguard Worker throws IOException, ExecutionException, InterruptedException { 706*ba8755cbSAndroid Build Coastguard Worker dirs.writeTo(zipArchiveOutputStream); 707*ba8755cbSAndroid Build Coastguard Worker dirs.close(); 708*ba8755cbSAndroid Build Coastguard Worker scatterZipCreator.writeTo(zipArchiveOutputStream); 709*ba8755cbSAndroid Build Coastguard Worker } 710*ba8755cbSAndroid Build Coastguard Worker} 711*ba8755cbSAndroid Build Coastguard Worker</source> 712*ba8755cbSAndroid Build Coastguard Worker </subsection> 713*ba8755cbSAndroid Build Coastguard Worker 714*ba8755cbSAndroid Build Coastguard Worker </section> 715*ba8755cbSAndroid Build Coastguard Worker <section name="Compressors"> 716*ba8755cbSAndroid Build Coastguard Worker 717*ba8755cbSAndroid Build Coastguard Worker <subsection name="Concatenated Streams"> 718*ba8755cbSAndroid Build Coastguard Worker <p>For the bzip2, gzip and xz formats as well as the framed 719*ba8755cbSAndroid Build Coastguard Worker lz4 format a single compressed file 720*ba8755cbSAndroid Build Coastguard Worker may actually consist of several streams that will be 721*ba8755cbSAndroid Build Coastguard Worker concatenated by the command line utilities when decompressing 722*ba8755cbSAndroid Build Coastguard Worker them. Starting with Commons Compress 1.4 the 723*ba8755cbSAndroid Build Coastguard Worker <code>*CompressorInputStream</code>s for these formats support 724*ba8755cbSAndroid Build Coastguard Worker concatenating streams as well, but they won't do so by 725*ba8755cbSAndroid Build Coastguard Worker default. You must use the two-arg constructor and explicitly 726*ba8755cbSAndroid Build Coastguard Worker enable the support.</p> 727*ba8755cbSAndroid Build Coastguard Worker </subsection> 728*ba8755cbSAndroid Build Coastguard Worker 729*ba8755cbSAndroid Build Coastguard Worker <subsection name="Brotli"> 730*ba8755cbSAndroid Build Coastguard Worker 731*ba8755cbSAndroid Build Coastguard Worker <p>The implementation of this package is provided by the 732*ba8755cbSAndroid Build Coastguard Worker <a href="https://github.com/google/brotli">Google Brotli dec</a> library.</p> 733*ba8755cbSAndroid Build Coastguard Worker 734*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given Brotli compressed file (you would 735*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 736*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 737*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 738*ba8755cbSAndroid Build Coastguard WorkerInputStream fin = Files.newInputStream(Paths.get("archive.tar.br")); 739*ba8755cbSAndroid Build Coastguard WorkerBufferedInputStream in = new BufferedInputStream(fin); 740*ba8755cbSAndroid Build Coastguard WorkerOutputStream out = Files.newOutputStream(Paths.get("archive.tar")); 741*ba8755cbSAndroid Build Coastguard WorkerBrotliCompressorInputStream brIn = new BrotliCompressorInputStream(in); 742*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 743*ba8755cbSAndroid Build Coastguard Workerint n = 0; 744*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = brIn.read(buffer))) { 745*ba8755cbSAndroid Build Coastguard Worker out.write(buffer, 0, n); 746*ba8755cbSAndroid Build Coastguard Worker} 747*ba8755cbSAndroid Build Coastguard Workerout.close(); 748*ba8755cbSAndroid Build Coastguard WorkerbrIn.close(); 749*ba8755cbSAndroid Build Coastguard Worker]]></source> 750*ba8755cbSAndroid Build Coastguard Worker </subsection> 751*ba8755cbSAndroid Build Coastguard Worker 752*ba8755cbSAndroid Build Coastguard Worker <subsection name="bzip2"> 753*ba8755cbSAndroid Build Coastguard Worker 754*ba8755cbSAndroid Build Coastguard Worker <p>Note that <code>BZipCompressorOutputStream</code> keeps 755*ba8755cbSAndroid Build Coastguard Worker hold of some big data structures in memory. While it is 756*ba8755cbSAndroid Build Coastguard Worker recommended for <em>any</em> stream that you close it as soon as 757*ba8755cbSAndroid Build Coastguard Worker you no longer need it, this is even more important 758*ba8755cbSAndroid Build Coastguard Worker for <code>BZipCompressorOutputStream</code>.</p> 759*ba8755cbSAndroid Build Coastguard Worker 760*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given bzip2 compressed file (you would 761*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 762*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 763*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 764*ba8755cbSAndroid Build Coastguard WorkerInputStream fin = Files.newInputStream(Paths.get("archive.tar.bz2")); 765*ba8755cbSAndroid Build Coastguard WorkerBufferedInputStream in = new BufferedInputStream(fin); 766*ba8755cbSAndroid Build Coastguard WorkerOutputStream out = Files.newOutputStream(Paths.get("archive.tar")); 767*ba8755cbSAndroid Build Coastguard WorkerBZip2CompressorInputStream bzIn = new BZip2CompressorInputStream(in); 768*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 769*ba8755cbSAndroid Build Coastguard Workerint n = 0; 770*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = bzIn.read(buffer))) { 771*ba8755cbSAndroid Build Coastguard Worker out.write(buffer, 0, n); 772*ba8755cbSAndroid Build Coastguard Worker} 773*ba8755cbSAndroid Build Coastguard Workerout.close(); 774*ba8755cbSAndroid Build Coastguard WorkerbzIn.close(); 775*ba8755cbSAndroid Build Coastguard Worker]]></source> 776*ba8755cbSAndroid Build Coastguard Worker 777*ba8755cbSAndroid Build Coastguard Worker <p>Compressing a given file using bzip2 (you would 778*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 779*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 780*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 781*ba8755cbSAndroid Build Coastguard WorkerInputStream in = Files.newInputStream(Paths.get("archive.tar")); 782*ba8755cbSAndroid Build Coastguard WorkerOutputStream fout = Files.newOutputStream(Paths.get("archive.tar.gz")); 783*ba8755cbSAndroid Build Coastguard WorkerBufferedOutputStream out = new BufferedOutputStream(fout); 784*ba8755cbSAndroid Build Coastguard WorkerBZip2CompressorOutputStream bzOut = new BZip2CompressorOutputStream(out); 785*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 786*ba8755cbSAndroid Build Coastguard Workerint n = 0; 787*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = in.read(buffer))) { 788*ba8755cbSAndroid Build Coastguard Worker bzOut.write(buffer, 0, n); 789*ba8755cbSAndroid Build Coastguard Worker} 790*ba8755cbSAndroid Build Coastguard WorkerbzOut.close(); 791*ba8755cbSAndroid Build Coastguard Workerin.close(); 792*ba8755cbSAndroid Build Coastguard Worker]]></source> 793*ba8755cbSAndroid Build Coastguard Worker 794*ba8755cbSAndroid Build Coastguard Worker </subsection> 795*ba8755cbSAndroid Build Coastguard Worker 796*ba8755cbSAndroid Build Coastguard Worker <subsection name="DEFLATE"> 797*ba8755cbSAndroid Build Coastguard Worker 798*ba8755cbSAndroid Build Coastguard Worker <p>The implementation of the DEFLATE/INFLATE code used by this 799*ba8755cbSAndroid Build Coastguard Worker package is provided by the <code>java.util.zip</code> package 800*ba8755cbSAndroid Build Coastguard Worker of the Java class library.</p> 801*ba8755cbSAndroid Build Coastguard Worker 802*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given DEFLATE compressed file (you would 803*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 804*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 805*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 806*ba8755cbSAndroid Build Coastguard WorkerInputStream fin = Files.newInputStream(Paths.get("some-file")); 807*ba8755cbSAndroid Build Coastguard WorkerBufferedInputStream in = new BufferedInputStream(fin); 808*ba8755cbSAndroid Build Coastguard WorkerOutputStream out = Files.newOutputStream(Paths.get("archive.tar")); 809*ba8755cbSAndroid Build Coastguard WorkerDeflateCompressorInputStream defIn = new DeflateCompressorInputStream(in); 810*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 811*ba8755cbSAndroid Build Coastguard Workerint n = 0; 812*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = defIn.read(buffer))) { 813*ba8755cbSAndroid Build Coastguard Worker out.write(buffer, 0, n); 814*ba8755cbSAndroid Build Coastguard Worker} 815*ba8755cbSAndroid Build Coastguard Workerout.close(); 816*ba8755cbSAndroid Build Coastguard WorkerdefIn.close(); 817*ba8755cbSAndroid Build Coastguard Worker]]></source> 818*ba8755cbSAndroid Build Coastguard Worker 819*ba8755cbSAndroid Build Coastguard Worker <p>Compressing a given file using DEFLATE (you would 820*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 821*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 822*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 823*ba8755cbSAndroid Build Coastguard WorkerInputStream in = Files.newInputStream(Paths.get("archive.tar")); 824*ba8755cbSAndroid Build Coastguard WorkerOutputStream fout = Files.newOutputStream(Paths.get("some-file")); 825*ba8755cbSAndroid Build Coastguard WorkerBufferedOutputStream out = new BufferedOutputStream(fout); 826*ba8755cbSAndroid Build Coastguard WorkerDeflateCompressorOutputStream defOut = new DeflateCompressorOutputStream(out); 827*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 828*ba8755cbSAndroid Build Coastguard Workerint n = 0; 829*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = in.read(buffer))) { 830*ba8755cbSAndroid Build Coastguard Worker defOut.write(buffer, 0, n); 831*ba8755cbSAndroid Build Coastguard Worker} 832*ba8755cbSAndroid Build Coastguard WorkerdefOut.close(); 833*ba8755cbSAndroid Build Coastguard Workerin.close(); 834*ba8755cbSAndroid Build Coastguard Worker]]></source> 835*ba8755cbSAndroid Build Coastguard Worker 836*ba8755cbSAndroid Build Coastguard Worker </subsection> 837*ba8755cbSAndroid Build Coastguard Worker 838*ba8755cbSAndroid Build Coastguard Worker <subsection name="DEFLATE64"> 839*ba8755cbSAndroid Build Coastguard Worker 840*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given DEFLATE64 compressed file (you would 841*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 842*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 843*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 844*ba8755cbSAndroid Build Coastguard WorkerInputStream fin = Files.newInputStream(Paths.get("some-file")); 845*ba8755cbSAndroid Build Coastguard WorkerBufferedInputStream in = new BufferedInputStream(fin); 846*ba8755cbSAndroid Build Coastguard WorkerOutputStream out = Files.newOutputStream(Paths.get("archive.tar")); 847*ba8755cbSAndroid Build Coastguard WorkerDeflate64CompressorInputStream defIn = new Deflate64CompressorInputStream(in); 848*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 849*ba8755cbSAndroid Build Coastguard Workerint n = 0; 850*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = defIn.read(buffer))) { 851*ba8755cbSAndroid Build Coastguard Worker out.write(buffer, 0, n); 852*ba8755cbSAndroid Build Coastguard Worker} 853*ba8755cbSAndroid Build Coastguard Workerout.close(); 854*ba8755cbSAndroid Build Coastguard WorkerdefIn.close(); 855*ba8755cbSAndroid Build Coastguard Worker]]></source> 856*ba8755cbSAndroid Build Coastguard Worker 857*ba8755cbSAndroid Build Coastguard Worker </subsection> 858*ba8755cbSAndroid Build Coastguard Worker 859*ba8755cbSAndroid Build Coastguard Worker <subsection name="gzip"> 860*ba8755cbSAndroid Build Coastguard Worker 861*ba8755cbSAndroid Build Coastguard Worker <p>The implementation of the DEFLATE/INFLATE code used by this 862*ba8755cbSAndroid Build Coastguard Worker package is provided by the <code>java.util.zip</code> package 863*ba8755cbSAndroid Build Coastguard Worker of the Java class library.</p> 864*ba8755cbSAndroid Build Coastguard Worker 865*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given gzip compressed file (you would 866*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 867*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 868*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 869*ba8755cbSAndroid Build Coastguard WorkerInputStream fin = Files.newInputStream(Paths.get("archive.tar.gz")); 870*ba8755cbSAndroid Build Coastguard WorkerBufferedInputStream in = new BufferedInputStream(fin); 871*ba8755cbSAndroid Build Coastguard WorkerOutputStream out = Files.newOutputStream(Paths.get("archive.tar")); 872*ba8755cbSAndroid Build Coastguard WorkerGzipCompressorInputStream gzIn = new GzipCompressorInputStream(in); 873*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 874*ba8755cbSAndroid Build Coastguard Workerint n = 0; 875*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = gzIn.read(buffer))) { 876*ba8755cbSAndroid Build Coastguard Worker out.write(buffer, 0, n); 877*ba8755cbSAndroid Build Coastguard Worker} 878*ba8755cbSAndroid Build Coastguard Workerout.close(); 879*ba8755cbSAndroid Build Coastguard WorkergzIn.close(); 880*ba8755cbSAndroid Build Coastguard Worker]]></source> 881*ba8755cbSAndroid Build Coastguard Worker 882*ba8755cbSAndroid Build Coastguard Worker <p>Compressing a given file using gzip (you would 883*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 884*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 885*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 886*ba8755cbSAndroid Build Coastguard WorkerInputStream in = Files.newInputStream(Paths.get("archive.tar")); 887*ba8755cbSAndroid Build Coastguard WorkerOutputStream fout = Files.newOutputStream(Paths.get("archive.tar.gz")); 888*ba8755cbSAndroid Build Coastguard WorkerBufferedOutputStream out = new BufferedOutputStream(fout); 889*ba8755cbSAndroid Build Coastguard WorkerGzipCompressorOutputStream gzOut = new GzipCompressorOutputStream(out); 890*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 891*ba8755cbSAndroid Build Coastguard Workerint n = 0; 892*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = in.read(buffer))) { 893*ba8755cbSAndroid Build Coastguard Worker gzOut.write(buffer, 0, n); 894*ba8755cbSAndroid Build Coastguard Worker} 895*ba8755cbSAndroid Build Coastguard WorkergzOut.close(); 896*ba8755cbSAndroid Build Coastguard Workerin.close(); 897*ba8755cbSAndroid Build Coastguard Worker]]></source> 898*ba8755cbSAndroid Build Coastguard Worker 899*ba8755cbSAndroid Build Coastguard Worker </subsection> 900*ba8755cbSAndroid Build Coastguard Worker 901*ba8755cbSAndroid Build Coastguard Worker <subsection name="LZ4"> 902*ba8755cbSAndroid Build Coastguard Worker 903*ba8755cbSAndroid Build Coastguard Worker <p>There are two different "formats" used for <a 904*ba8755cbSAndroid Build Coastguard Worker href="http://lz4.github.io/lz4/">lz4</a>. The format called 905*ba8755cbSAndroid Build Coastguard Worker "block format" only contains the raw compressed data while the 906*ba8755cbSAndroid Build Coastguard Worker other provides a higher level "frame format" - Commons 907*ba8755cbSAndroid Build Coastguard Worker Compress offers two different stream classes for reading or 908*ba8755cbSAndroid Build Coastguard Worker writing either format.</p> 909*ba8755cbSAndroid Build Coastguard Worker 910*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given frame LZ4 file (you would 911*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 912*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 913*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 914*ba8755cbSAndroid Build Coastguard WorkerInputStream fin = Files.newInputStream(Paths.get("archive.tar.lz4")); 915*ba8755cbSAndroid Build Coastguard WorkerBufferedInputStream in = new BufferedInputStream(fin); 916*ba8755cbSAndroid Build Coastguard WorkerOutputStream out = Files.newOutputStream(Paths.get("archive.tar")); 917*ba8755cbSAndroid Build Coastguard WorkerFramedLZ4CompressorInputStream zIn = new FramedLZ4CompressorInputStream(in); 918*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 919*ba8755cbSAndroid Build Coastguard Workerint n = 0; 920*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = zIn.read(buffer))) { 921*ba8755cbSAndroid Build Coastguard Worker out.write(buffer, 0, n); 922*ba8755cbSAndroid Build Coastguard Worker} 923*ba8755cbSAndroid Build Coastguard Workerout.close(); 924*ba8755cbSAndroid Build Coastguard WorkerzIn.close(); 925*ba8755cbSAndroid Build Coastguard Worker]]></source> 926*ba8755cbSAndroid Build Coastguard Worker 927*ba8755cbSAndroid Build Coastguard Worker <p>Compressing a given file using the LZ4 frame format (you would 928*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 929*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 930*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 931*ba8755cbSAndroid Build Coastguard WorkerInputStream in = Files.newInputStream(Paths.get("archive.tar")); 932*ba8755cbSAndroid Build Coastguard WorkerOutputStream fout = Files.newOutputStream(Paths.get("archive.tar.lz4")); 933*ba8755cbSAndroid Build Coastguard WorkerBufferedOutputStream out = new BufferedOutputStream(fout); 934*ba8755cbSAndroid Build Coastguard WorkerFramedLZ4CompressorOutputStream lzOut = new FramedLZ4CompressorOutputStream(out); 935*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 936*ba8755cbSAndroid Build Coastguard Workerint n = 0; 937*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = in.read(buffer))) { 938*ba8755cbSAndroid Build Coastguard Worker lzOut.write(buffer, 0, n); 939*ba8755cbSAndroid Build Coastguard Worker} 940*ba8755cbSAndroid Build Coastguard WorkerlzOut.close(); 941*ba8755cbSAndroid Build Coastguard Workerin.close(); 942*ba8755cbSAndroid Build Coastguard Worker]]></source> 943*ba8755cbSAndroid Build Coastguard Worker 944*ba8755cbSAndroid Build Coastguard Worker </subsection> 945*ba8755cbSAndroid Build Coastguard Worker 946*ba8755cbSAndroid Build Coastguard Worker <subsection name="lzma"> 947*ba8755cbSAndroid Build Coastguard Worker 948*ba8755cbSAndroid Build Coastguard Worker <p>The implementation of this package is provided by the 949*ba8755cbSAndroid Build Coastguard Worker public domain <a href="https://tukaani.org/xz/java.html">XZ 950*ba8755cbSAndroid Build Coastguard Worker for Java</a> library.</p> 951*ba8755cbSAndroid Build Coastguard Worker 952*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given lzma compressed file (you would 953*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 954*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 955*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 956*ba8755cbSAndroid Build Coastguard WorkerInputStream fin = Files.newInputStream(Paths.get("archive.tar.lzma")); 957*ba8755cbSAndroid Build Coastguard WorkerBufferedInputStream in = new BufferedInputStream(fin); 958*ba8755cbSAndroid Build Coastguard WorkerOutputStream out = Files.newOutputStream(Paths.get("archive.tar")); 959*ba8755cbSAndroid Build Coastguard WorkerLZMACompressorInputStream lzmaIn = new LZMACompressorInputStream(in); 960*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 961*ba8755cbSAndroid Build Coastguard Workerint n = 0; 962*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = xzIn.read(buffer))) { 963*ba8755cbSAndroid Build Coastguard Worker out.write(buffer, 0, n); 964*ba8755cbSAndroid Build Coastguard Worker} 965*ba8755cbSAndroid Build Coastguard Workerout.close(); 966*ba8755cbSAndroid Build Coastguard WorkerlzmaIn.close(); 967*ba8755cbSAndroid Build Coastguard Worker]]></source> 968*ba8755cbSAndroid Build Coastguard Worker 969*ba8755cbSAndroid Build Coastguard Worker <p>Compressing a given file using lzma (you would 970*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 971*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 972*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 973*ba8755cbSAndroid Build Coastguard WorkerInputStream in = Files.newInputStream(Paths.get("archive.tar")); 974*ba8755cbSAndroid Build Coastguard WorkerOutputStream fout = Files.newOutputStream(Paths.get("archive.tar.lzma")); 975*ba8755cbSAndroid Build Coastguard WorkerBufferedOutputStream out = new BufferedOutputStream(fout); 976*ba8755cbSAndroid Build Coastguard WorkerLZMACompressorOutputStream lzOut = new LZMACompressorOutputStream(out); 977*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 978*ba8755cbSAndroid Build Coastguard Workerint n = 0; 979*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = in.read(buffer))) { 980*ba8755cbSAndroid Build Coastguard Worker lzOut.write(buffer, 0, n); 981*ba8755cbSAndroid Build Coastguard Worker} 982*ba8755cbSAndroid Build Coastguard WorkerlzOut.close(); 983*ba8755cbSAndroid Build Coastguard Workerin.close(); 984*ba8755cbSAndroid Build Coastguard Worker]]></source> 985*ba8755cbSAndroid Build Coastguard Worker 986*ba8755cbSAndroid Build Coastguard Worker </subsection> 987*ba8755cbSAndroid Build Coastguard Worker 988*ba8755cbSAndroid Build Coastguard Worker <subsection name="Pack200"> 989*ba8755cbSAndroid Build Coastguard Worker 990*ba8755cbSAndroid Build Coastguard Worker <p>The Pack200 package has a <a href="pack200.html">dedicated 991*ba8755cbSAndroid Build Coastguard Worker documentation page</a>.</p> 992*ba8755cbSAndroid Build Coastguard Worker 993*ba8755cbSAndroid Build Coastguard Worker <p>The implementation of this package is provided by 994*ba8755cbSAndroid Build Coastguard Worker the <code>java.util.zip</code> package of the Java class 995*ba8755cbSAndroid Build Coastguard Worker library.</p> 996*ba8755cbSAndroid Build Coastguard Worker 997*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given pack200 compressed file (you would 998*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 999*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 1000*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 1001*ba8755cbSAndroid Build Coastguard WorkerInputStream fin = Files.newInputStream(Paths.get("archive.pack")); 1002*ba8755cbSAndroid Build Coastguard WorkerBufferedInputStream in = new BufferedInputStream(fin); 1003*ba8755cbSAndroid Build Coastguard WorkerOutputStream out = Files.newOutputStream(Paths.get("archive.jar")); 1004*ba8755cbSAndroid Build Coastguard WorkerPack200CompressorInputStream pIn = new Pack200CompressorInputStream(in); 1005*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 1006*ba8755cbSAndroid Build Coastguard Workerint n = 0; 1007*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = pIn.read(buffer))) { 1008*ba8755cbSAndroid Build Coastguard Worker out.write(buffer, 0, n); 1009*ba8755cbSAndroid Build Coastguard Worker} 1010*ba8755cbSAndroid Build Coastguard Workerout.close(); 1011*ba8755cbSAndroid Build Coastguard WorkerpIn.close(); 1012*ba8755cbSAndroid Build Coastguard Worker]]></source> 1013*ba8755cbSAndroid Build Coastguard Worker 1014*ba8755cbSAndroid Build Coastguard Worker <p>Compressing a given jar using pack200 (you would 1015*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 1016*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 1017*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 1018*ba8755cbSAndroid Build Coastguard WorkerInputStream in = Files.newInputStream(Paths.get("archive.jar")); 1019*ba8755cbSAndroid Build Coastguard WorkerOutputStream fout = Files.newOutputStream(Paths.get("archive.pack")); 1020*ba8755cbSAndroid Build Coastguard WorkerBufferedOutputStream out = new BufferedInputStream(fout); 1021*ba8755cbSAndroid Build Coastguard WorkerPack200CompressorOutputStream pOut = new Pack200CompressorOutputStream(out); 1022*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 1023*ba8755cbSAndroid Build Coastguard Workerint n = 0; 1024*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = in.read(buffer))) { 1025*ba8755cbSAndroid Build Coastguard Worker pOut.write(buffer, 0, n); 1026*ba8755cbSAndroid Build Coastguard Worker} 1027*ba8755cbSAndroid Build Coastguard WorkerpOut.close(); 1028*ba8755cbSAndroid Build Coastguard Workerin.close(); 1029*ba8755cbSAndroid Build Coastguard Worker]]></source> 1030*ba8755cbSAndroid Build Coastguard Worker 1031*ba8755cbSAndroid Build Coastguard Worker </subsection> 1032*ba8755cbSAndroid Build Coastguard Worker 1033*ba8755cbSAndroid Build Coastguard Worker <subsection name="Snappy"> 1034*ba8755cbSAndroid Build Coastguard Worker 1035*ba8755cbSAndroid Build Coastguard Worker <p>There are two different "formats" used for <a 1036*ba8755cbSAndroid Build Coastguard Worker href="https://github.com/google/snappy/">Snappy</a>, one only 1037*ba8755cbSAndroid Build Coastguard Worker contains the raw compressed data while the other provides a 1038*ba8755cbSAndroid Build Coastguard Worker higher level "framing format" - Commons Compress offers two 1039*ba8755cbSAndroid Build Coastguard Worker different stream classes for reading either format.</p> 1040*ba8755cbSAndroid Build Coastguard Worker 1041*ba8755cbSAndroid Build Coastguard Worker <p>Starting with 1.12 we've added support for different 1042*ba8755cbSAndroid Build Coastguard Worker dialects of the framing format that can be specified when 1043*ba8755cbSAndroid Build Coastguard Worker constructing the stream. The <code>STANDARD</code> dialect 1044*ba8755cbSAndroid Build Coastguard Worker follows the "framing format" specification while the 1045*ba8755cbSAndroid Build Coastguard Worker <code>IWORK_ARCHIVE</code> dialect can be used to parse IWA 1046*ba8755cbSAndroid Build Coastguard Worker files that are part of Apple's iWork 13 format. If no dialect 1047*ba8755cbSAndroid Build Coastguard Worker has been specified, <code>STANDARD</code> is used. Only the 1048*ba8755cbSAndroid Build Coastguard Worker <code>STANDARD</code> format can be detected by 1049*ba8755cbSAndroid Build Coastguard Worker <code>CompressorStreamFactory</code>.</p> 1050*ba8755cbSAndroid Build Coastguard Worker 1051*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given framed Snappy file (you would 1052*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 1053*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 1054*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 1055*ba8755cbSAndroid Build Coastguard WorkerInputStream fin = Files.newInputStream(Paths.get("archive.tar.sz")); 1056*ba8755cbSAndroid Build Coastguard WorkerBufferedInputStream in = new BufferedInputStream(fin); 1057*ba8755cbSAndroid Build Coastguard WorkerOutputStream out = Files.newOutputStream(Paths.get("archive.tar")); 1058*ba8755cbSAndroid Build Coastguard WorkerFramedSnappyCompressorInputStream zIn = new FramedSnappyCompressorInputStream(in); 1059*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 1060*ba8755cbSAndroid Build Coastguard Workerint n = 0; 1061*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = zIn.read(buffer))) { 1062*ba8755cbSAndroid Build Coastguard Worker out.write(buffer, 0, n); 1063*ba8755cbSAndroid Build Coastguard Worker} 1064*ba8755cbSAndroid Build Coastguard Workerout.close(); 1065*ba8755cbSAndroid Build Coastguard WorkerzIn.close(); 1066*ba8755cbSAndroid Build Coastguard Worker]]></source> 1067*ba8755cbSAndroid Build Coastguard Worker 1068*ba8755cbSAndroid Build Coastguard Worker <p>Compressing a given file using framed Snappy (you would 1069*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 1070*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 1071*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 1072*ba8755cbSAndroid Build Coastguard WorkerInputStream in = Files.newInputStream(Paths.get("archive.tar")); 1073*ba8755cbSAndroid Build Coastguard WorkerOutputStream fout = Files.newOutputStream(Paths.get("archive.tar.sz")); 1074*ba8755cbSAndroid Build Coastguard WorkerBufferedOutputStream out = new BufferedOutputStream(fout); 1075*ba8755cbSAndroid Build Coastguard WorkerFramedSnappyCompressorOutputStream snOut = new FramedSnappyCompressorOutputStream(out); 1076*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 1077*ba8755cbSAndroid Build Coastguard Workerint n = 0; 1078*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = in.read(buffer))) { 1079*ba8755cbSAndroid Build Coastguard Worker snOut.write(buffer, 0, n); 1080*ba8755cbSAndroid Build Coastguard Worker} 1081*ba8755cbSAndroid Build Coastguard WorkersnOut.close(); 1082*ba8755cbSAndroid Build Coastguard Workerin.close(); 1083*ba8755cbSAndroid Build Coastguard Worker]]></source> 1084*ba8755cbSAndroid Build Coastguard Worker 1085*ba8755cbSAndroid Build Coastguard Worker </subsection> 1086*ba8755cbSAndroid Build Coastguard Worker 1087*ba8755cbSAndroid Build Coastguard Worker <subsection name="XZ"> 1088*ba8755cbSAndroid Build Coastguard Worker 1089*ba8755cbSAndroid Build Coastguard Worker <p>The implementation of this package is provided by the 1090*ba8755cbSAndroid Build Coastguard Worker public domain <a href="https://tukaani.org/xz/java.html">XZ 1091*ba8755cbSAndroid Build Coastguard Worker for Java</a> library.</p> 1092*ba8755cbSAndroid Build Coastguard Worker 1093*ba8755cbSAndroid Build Coastguard Worker <p>When you try to open an XZ stream for reading using 1094*ba8755cbSAndroid Build Coastguard Worker <code>CompressorStreamFactory</code>, Commons Compress will 1095*ba8755cbSAndroid Build Coastguard Worker check whether the XZ for Java library is available. Starting 1096*ba8755cbSAndroid Build Coastguard Worker with Compress 1.9 the result of this check will be cached 1097*ba8755cbSAndroid Build Coastguard Worker unless Compress finds OSGi classes in its classpath. You can 1098*ba8755cbSAndroid Build Coastguard Worker use <code>XZUtils#setCacheXZAvailability</code> to overrride 1099*ba8755cbSAndroid Build Coastguard Worker this default behavior.</p> 1100*ba8755cbSAndroid Build Coastguard Worker 1101*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given XZ compressed file (you would 1102*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 1103*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 1104*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 1105*ba8755cbSAndroid Build Coastguard WorkerInputStream fin = Files.newInputStream(Paths.get("archive.tar.xz")); 1106*ba8755cbSAndroid Build Coastguard WorkerBufferedInputStream in = new BufferedInputStream(fin); 1107*ba8755cbSAndroid Build Coastguard WorkerOutputStream out = Files.newOutputStream(Paths.get("archive.tar")); 1108*ba8755cbSAndroid Build Coastguard WorkerXZCompressorInputStream xzIn = new XZCompressorInputStream(in); 1109*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 1110*ba8755cbSAndroid Build Coastguard Workerint n = 0; 1111*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = xzIn.read(buffer))) { 1112*ba8755cbSAndroid Build Coastguard Worker out.write(buffer, 0, n); 1113*ba8755cbSAndroid Build Coastguard Worker} 1114*ba8755cbSAndroid Build Coastguard Workerout.close(); 1115*ba8755cbSAndroid Build Coastguard WorkerxzIn.close(); 1116*ba8755cbSAndroid Build Coastguard Worker]]></source> 1117*ba8755cbSAndroid Build Coastguard Worker 1118*ba8755cbSAndroid Build Coastguard Worker <p>Compressing a given file using XZ (you would 1119*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 1120*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 1121*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 1122*ba8755cbSAndroid Build Coastguard WorkerInputStream in = Files.newInputStream(Paths.get("archive.tar")); 1123*ba8755cbSAndroid Build Coastguard WorkerOutputStream fout = Files.newOutputStream(Paths.get("archive.tar.xz")); 1124*ba8755cbSAndroid Build Coastguard WorkerBufferedOutputStream out = new BufferedInputStream(fout); 1125*ba8755cbSAndroid Build Coastguard WorkerXZCompressorOutputStream xzOut = new XZCompressorOutputStream(out); 1126*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 1127*ba8755cbSAndroid Build Coastguard Workerint n = 0; 1128*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = in.read(buffer))) { 1129*ba8755cbSAndroid Build Coastguard Worker xzOut.write(buffer, 0, n); 1130*ba8755cbSAndroid Build Coastguard Worker} 1131*ba8755cbSAndroid Build Coastguard WorkerxzOut.close(); 1132*ba8755cbSAndroid Build Coastguard Workerin.close(); 1133*ba8755cbSAndroid Build Coastguard Worker]]></source> 1134*ba8755cbSAndroid Build Coastguard Worker 1135*ba8755cbSAndroid Build Coastguard Worker </subsection> 1136*ba8755cbSAndroid Build Coastguard Worker 1137*ba8755cbSAndroid Build Coastguard Worker <subsection name="Z"> 1138*ba8755cbSAndroid Build Coastguard Worker 1139*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given Z compressed file (you would 1140*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 1141*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 1142*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 1143*ba8755cbSAndroid Build Coastguard WorkerInputStream fin = Files.newInputStream(Paths.get("archive.tar.Z")); 1144*ba8755cbSAndroid Build Coastguard WorkerBufferedInputStream in = new BufferedInputStream(fin); 1145*ba8755cbSAndroid Build Coastguard WorkerOutputStream out = Files.newOutputStream(Paths.get("archive.tar")); 1146*ba8755cbSAndroid Build Coastguard WorkerZCompressorInputStream zIn = new ZCompressorInputStream(in); 1147*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 1148*ba8755cbSAndroid Build Coastguard Workerint n = 0; 1149*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = zIn.read(buffer))) { 1150*ba8755cbSAndroid Build Coastguard Worker out.write(buffer, 0, n); 1151*ba8755cbSAndroid Build Coastguard Worker} 1152*ba8755cbSAndroid Build Coastguard Workerout.close(); 1153*ba8755cbSAndroid Build Coastguard WorkerzIn.close(); 1154*ba8755cbSAndroid Build Coastguard Worker]]></source> 1155*ba8755cbSAndroid Build Coastguard Worker 1156*ba8755cbSAndroid Build Coastguard Worker </subsection> 1157*ba8755cbSAndroid Build Coastguard Worker 1158*ba8755cbSAndroid Build Coastguard Worker <subsection name="Zstandard"> 1159*ba8755cbSAndroid Build Coastguard Worker 1160*ba8755cbSAndroid Build Coastguard Worker <p>The implementation of this package is provided by the 1161*ba8755cbSAndroid Build Coastguard Worker <a href="https://github.com/luben/zstd-jni">Zstandard JNI</a> library.</p> 1162*ba8755cbSAndroid Build Coastguard Worker 1163*ba8755cbSAndroid Build Coastguard Worker <p>Uncompressing a given Zstandard compressed file (you would 1164*ba8755cbSAndroid Build Coastguard Worker certainly add exception handling and make sure all streams 1165*ba8755cbSAndroid Build Coastguard Worker get closed properly):</p> 1166*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 1167*ba8755cbSAndroid Build Coastguard WorkerInputStream fin = Files.newInputStream(Paths.get("archive.tar.zstd")); 1168*ba8755cbSAndroid Build Coastguard WorkerBufferedInputStream in = new BufferedInputStream(fin); 1169*ba8755cbSAndroid Build Coastguard WorkerOutputStream out = Files.newOutputStream(Paths.get("archive.tar")); 1170*ba8755cbSAndroid Build Coastguard WorkerZstdCompressorInputStream zsIn = new ZstdCompressorInputStream(in); 1171*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 1172*ba8755cbSAndroid Build Coastguard Workerint n = 0; 1173*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = zsIn.read(buffer))) { 1174*ba8755cbSAndroid Build Coastguard Worker out.write(buffer, 0, n); 1175*ba8755cbSAndroid Build Coastguard Worker} 1176*ba8755cbSAndroid Build Coastguard Workerout.close(); 1177*ba8755cbSAndroid Build Coastguard WorkerzsIn.close(); 1178*ba8755cbSAndroid Build Coastguard Worker]]></source> 1179*ba8755cbSAndroid Build Coastguard Worker 1180*ba8755cbSAndroid Build Coastguard Worker <p>Compressing a given file using the Zstandard format (you 1181*ba8755cbSAndroid Build Coastguard Worker would certainly add exception handling and make sure all 1182*ba8755cbSAndroid Build Coastguard Worker streams get closed properly):</p> 1183*ba8755cbSAndroid Build Coastguard Worker<source><![CDATA[ 1184*ba8755cbSAndroid Build Coastguard WorkerInputStream in = Files.newInputStream(Paths.get("archive.tar")); 1185*ba8755cbSAndroid Build Coastguard WorkerOutputStream fout = Files.newOutputStream(Paths.get("archive.tar.zstd")); 1186*ba8755cbSAndroid Build Coastguard WorkerBufferedOutputStream out = new BufferedOutputStream(fout); 1187*ba8755cbSAndroid Build Coastguard WorkerZstdCompressorOutputStream zOut = new ZstdCompressorOutputStream(out); 1188*ba8755cbSAndroid Build Coastguard Workerfinal byte[] buffer = new byte[buffersize]; 1189*ba8755cbSAndroid Build Coastguard Workerint n = 0; 1190*ba8755cbSAndroid Build Coastguard Workerwhile (-1 != (n = in.read(buffer))) { 1191*ba8755cbSAndroid Build Coastguard Worker zOut.write(buffer, 0, n); 1192*ba8755cbSAndroid Build Coastguard Worker} 1193*ba8755cbSAndroid Build Coastguard WorkerzOut.close(); 1194*ba8755cbSAndroid Build Coastguard Workerin.close(); 1195*ba8755cbSAndroid Build Coastguard Worker]]></source> 1196*ba8755cbSAndroid Build Coastguard Worker 1197*ba8755cbSAndroid Build Coastguard Worker </subsection> 1198*ba8755cbSAndroid Build Coastguard Worker </section> 1199*ba8755cbSAndroid Build Coastguard Worker 1200*ba8755cbSAndroid Build Coastguard Worker <section name="Extending Commons Compress"> 1201*ba8755cbSAndroid Build Coastguard Worker 1202*ba8755cbSAndroid Build Coastguard Worker <p> 1203*ba8755cbSAndroid Build Coastguard Worker Starting in release 1.13, it is now possible to add Compressor- and ArchiverStream implementations using the 1204*ba8755cbSAndroid Build Coastguard Worker Java's <a href="https://docs.oracle.com/javase/7/docs/api/java/util/ServiceLoader.html">ServiceLoader</a> 1205*ba8755cbSAndroid Build Coastguard Worker mechanism. 1206*ba8755cbSAndroid Build Coastguard Worker </p> 1207*ba8755cbSAndroid Build Coastguard Worker 1208*ba8755cbSAndroid Build Coastguard Worker <subsection name="Extending Commons Compress Compressors"> 1209*ba8755cbSAndroid Build Coastguard Worker 1210*ba8755cbSAndroid Build Coastguard Worker <p> 1211*ba8755cbSAndroid Build Coastguard Worker To provide your own compressor, you must make available on the classpath a file called 1212*ba8755cbSAndroid Build Coastguard Worker <code>META-INF/services/org.apache.commons.compress.compressors.CompressorStreamProvider</code>. 1213*ba8755cbSAndroid Build Coastguard Worker </p> 1214*ba8755cbSAndroid Build Coastguard Worker <p> 1215*ba8755cbSAndroid Build Coastguard Worker This file MUST contain one fully-qualified class name per line. 1216*ba8755cbSAndroid Build Coastguard Worker </p> 1217*ba8755cbSAndroid Build Coastguard Worker <p> 1218*ba8755cbSAndroid Build Coastguard Worker For example: 1219*ba8755cbSAndroid Build Coastguard Worker </p> 1220*ba8755cbSAndroid Build Coastguard Worker <pre>org.apache.commons.compress.compressors.TestCompressorStreamProvider</pre> 1221*ba8755cbSAndroid Build Coastguard Worker <p> 1222*ba8755cbSAndroid Build Coastguard Worker This class MUST implement the Commons Compress interface 1223*ba8755cbSAndroid Build Coastguard Worker <a href="apidocs/org/apache/commons/compress/compressors/CompressorStreamProvider.html">org.apache.commons.compress.compressors.CompressorStreamProvider</a>. 1224*ba8755cbSAndroid Build Coastguard Worker </p> 1225*ba8755cbSAndroid Build Coastguard Worker </subsection> 1226*ba8755cbSAndroid Build Coastguard Worker 1227*ba8755cbSAndroid Build Coastguard Worker <subsection name="Extending Commons Compress Archivers"> 1228*ba8755cbSAndroid Build Coastguard Worker 1229*ba8755cbSAndroid Build Coastguard Worker <p> 1230*ba8755cbSAndroid Build Coastguard Worker To provide your own compressor, you must make available on the classpath a file called 1231*ba8755cbSAndroid Build Coastguard Worker <code>META-INF/services/org.apache.commons.compress.archivers.ArchiveStreamProvider</code>. 1232*ba8755cbSAndroid Build Coastguard Worker </p> 1233*ba8755cbSAndroid Build Coastguard Worker <p> 1234*ba8755cbSAndroid Build Coastguard Worker This file MUST contain one fully-qualified class name per line. 1235*ba8755cbSAndroid Build Coastguard Worker </p> 1236*ba8755cbSAndroid Build Coastguard Worker <p> 1237*ba8755cbSAndroid Build Coastguard Worker For example: 1238*ba8755cbSAndroid Build Coastguard Worker </p> 1239*ba8755cbSAndroid Build Coastguard Worker <pre>org.apache.commons.compress.archivers.TestArchiveStreamProvider</pre> 1240*ba8755cbSAndroid Build Coastguard Worker <p> 1241*ba8755cbSAndroid Build Coastguard Worker This class MUST implement the Commons Compress interface 1242*ba8755cbSAndroid Build Coastguard Worker <a href="apidocs/org/apache/commons/compress/archivers/ArchiveStreamProvider.html">org.apache.commons.compress.archivers.ArchiveStreamProvider</a>. 1243*ba8755cbSAndroid Build Coastguard Worker </p> 1244*ba8755cbSAndroid Build Coastguard Worker </subsection> 1245*ba8755cbSAndroid Build Coastguard Worker 1246*ba8755cbSAndroid Build Coastguard Worker </section> 1247*ba8755cbSAndroid Build Coastguard Worker </body> 1248*ba8755cbSAndroid Build Coastguard Worker</document> 1249