# Pack200

public abstract class **Pack200** extends [Object](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html)  
Transforms a JAR file to or from a packed stream in Pack200 format.
Please refer to Network Transfer Format JSR 200 Specification at
<http://jcp.org/aboutJava/communityprocess/review/jsr200/index.html>


Typically the packer engine is used by application developers
to deploy or host JAR files on a website.
The unpacker engine is used by deployment applications to
transform the byte-stream back to JAR format.


Here is an example using packer and unpacker:

    import java.util.jar.Pack200;
        import java.util.jar.Pack200.*;
        ...
        // Create the Packer object
        Packer packer = Pack200.newPacker();

        // Initialize the state by setting the desired properties
        Map p = packer.properties();
        // take more time choosing codings for better compression
        p.put(Packer.EFFORT, "7");  // default is "5"
        // use largest-possible archive segments (>10% better compression).
        p.put(Packer.SEGMENT_LIMIT, "-1");
        // reorder files for better compression.
        p.put(Packer.KEEP_FILE_ORDER, Packer.FALSE);
        // smear modification times to a single value.
        p.put(Packer.MODIFICATION_TIME, Packer.LATEST);
        // ignore all JAR deflation requests,
        // transmitting a single request to use "store" mode.
        p.put(Packer.DEFLATE_HINT, Packer.FALSE);
        // discard debug attributes
        p.put(Packer.CODE_ATTRIBUTE_PFX+"LineNumberTable", Packer.STRIP);
        // throw an error if an attribute is unrecognized
        p.put(Packer.UNKNOWN_ATTRIBUTE, Packer.ERROR);
        // pass one class file uncompressed:
        p.put(Packer.PASS_FILE_PFX+0, "mutants/Rogue.class");
        try {
            JarFile jarFile = new JarFile("/tmp/testref.jar");
            FileOutputStream fos = new FileOutputStream("/tmp/test.pack");
            // Call the packer
            packer.pack(jarFile, fos);
            jarFile.close();
            fos.close();

            File f = new File("/tmp/test.pack");
            FileOutputStream fostream = new FileOutputStream("/tmp/test.jar");
            JarOutputStream jostream = new JarOutputStream(fostream);
            Unpacker unpacker = Pack200.newUnpacker();
            // Call the unpacker
            unpacker.unpack(f, jostream);
            // Must explicitly close the output.
            jostream.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
     

A Pack200 file compressed with gzip can be hosted on HTTP/1.1 web servers.
The deployment applications can use "Accept-Encoding=pack200-gzip". This
indicates to the server that the client application desires a version of
the file encoded with Pack200 and further compressed with gzip. Please
refer to [Java Deployment Guide](https://developers.google.com/j2objc/javadoc/jre/technotes/guides/deployment/deployment-guide/pack200.html) for more details and
techniques.


Unless otherwise noted, passing a null argument to a constructor or
method in this class will cause a `https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/NullPointerException.html` to be thrown.

### Nested Class Summary

|---|---|---|---|
| interface | [Pack200.Packer](https://developers.google.com/j2objc/javadoc/jre/reference/java/util/jar/Pack200.Packer.html) || The packer engine applies various transformations to the input JAR file, making the pack stream highly compressible by a compressor such as gzip or zip. |
| interface | [Pack200.Unpacker](https://developers.google.com/j2objc/javadoc/jre/reference/java/util/jar/Pack200.Unpacker.html) || The unpacker engine converts the packed stream to a JAR file. |

### Public Method Summary

|---|---|
| synchronized static [Pack200.Packer](https://developers.google.com/j2objc/javadoc/jre/reference/java/util/jar/Pack200.Packer.html) | [newPacker](https://developers.google.com/j2objc/javadoc/jre/reference/java/util/jar/Pack200.html#newPacker())() Obtain new instance of a class that implements Packer. |
| static [Pack200.Unpacker](https://developers.google.com/j2objc/javadoc/jre/reference/java/util/jar/Pack200.Unpacker.html) | [newUnpacker](https://developers.google.com/j2objc/javadoc/jre/reference/java/util/jar/Pack200.html#newUnpacker())() Obtain new instance of a class that implements Unpacker. |

### Inherited Method Summary

From class [java.lang.Object](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html)

|---|---|
| [Object](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html) | [clone](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html#clone())() Creates and returns a copy of this `Object`. |
| boolean | [equals](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html#equals(java.lang.Object))([Object](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html) obj) Compares this instance with the specified object and indicates if they are equal. |
| void | [finalize](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html#finalize())() Invoked when the garbage collector has detected that this instance is no longer reachable. |
| final [Class](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Class.html)\<?\> | [getClass](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html#getClass())() Returns the unique instance of `https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Class.html` that represents this object's class. |
| int | [hashCode](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html#hashCode())() Returns an integer hash code for this object. |
| final void | [notify](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html#notify())() Causes a thread which is waiting on this object's monitor (by means of calling one of the `wait()` methods) to be woken up. |
| final void | [notifyAll](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html#notifyAll())() Causes all threads which are waiting on this object's monitor (by means of calling one of the `wait()` methods) to be woken up. |
| [String](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/String.html) | [toString](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html#toString())() Returns a string containing a concise, human-readable description of this object. |
| final void | [wait](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html#wait(long,%20int))(long timeout, int nanos) Causes the calling thread to wait until another thread calls the `notify()` or `notifyAll()` method of this object or until the specified timeout expires. |
| final void | [wait](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html#wait(long))(long timeout) Causes the calling thread to wait until another thread calls the `notify()` or `notifyAll()` method of this object or until the specified timeout expires. |
| final void | [wait](https://developers.google.com/j2objc/javadoc/jre/reference/java/lang/Object.html#wait())() Causes the calling thread to wait until another thread calls the `notify()` or `notifyAll()` method of this object. |

## Public Methods

#### public static synchronized [Pack200.Packer](https://developers.google.com/j2objc/javadoc/jre/reference/java/util/jar/Pack200.Packer.html)
**newPacker**
()

Obtain new instance of a class that implements Packer.

- If the system property java.util.jar.Pack200.Packer
  is defined, then the value is taken to be the fully-qualified name
  of a concrete implementation class, which must implement Packer.
  This class is loaded and instantiated. If this process fails
  then an unspecified error is thrown.

- If an implementation has not been specified with the system
  property, then the system-default implementation class is instantiated,
  and the result is returned.

Note: The returned object is not guaranteed to operate
correctly if multiple threads use it at the same time.
A multi-threaded application should either allocate multiple
packer engines, or else serialize use of one engine with a lock.

##### Returns

- A newly allocated Packer engine.

#### public static [Pack200.Unpacker](https://developers.google.com/j2objc/javadoc/jre/reference/java/util/jar/Pack200.Unpacker.html)
**newUnpacker**
()

Obtain new instance of a class that implements Unpacker.

- If the system property java.util.jar.Pack200.Unpacker
  is defined, then the value is taken to be the fully-qualified
  name of a concrete implementation class, which must implement Unpacker.
  The class is loaded and instantiated. If this process fails
  then an unspecified error is thrown.

- If an implementation has not been specified with the
  system property, then the system-default implementation class
  is instantiated, and the result is returned.

Note: The returned object is not guaranteed to operate
correctly if multiple threads use it at the same time.
A multi-threaded application should either allocate multiple
unpacker engines, or else serialize use of one engine with a lock.

##### Returns

- A newly allocated Unpacker engine.