xref: /aosp_15_r20/external/apache-commons-compress/src/site/xdoc/examples.xml (revision ba8755cb0ae00084b4d58129cd522613d3299f27)
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() &amp;&amp; !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