Added in [API level 1](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels) Summary: [Nested Classes](https://developer.android.com/reference/java/util/jar/Pack200#nestedclasses) \| [Methods](https://developer.android.com/reference/java/util/jar/Pack200#pubmethods) \| [Inherited Methods](https://developer.android.com/reference/java/util/jar/Pack200#inhmethods)

# Pack200

` public abstract class Pack200 `   
` extends https://developer.android.com/reference/java/lang/Object ` ` `

|---|---|
| [java.lang.Object](https://developer.android.com/reference/java/lang/Object) ||
| ↳ | java.util.jar.Pack200 |

<br />

*** ** * ** ***

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://docs.oracle.com/javase/8/docs/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://developer.android.com/reference/java/lang/NullPointerException` to be thrown.

## Summary

| ### Nested classes ||
|---|---|
| ` interface` | `https://developer.android.com/reference/java/util/jar/Pack200.Packer` 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` | `https://developer.android.com/reference/java/util/jar/Pack200.Unpacker` The unpacker engine converts the packed stream to a JAR file. |

| ### Public methods ||
|---|---|
| ` static https://developer.android.com/reference/java/util/jar/Pack200.Packer` | ` https://developer.android.com/reference/java/util/jar/Pack200#newPacker()() ` Obtain new instance of a class that implements Packer. |
| ` static https://developer.android.com/reference/java/util/jar/Pack200.Unpacker` | ` https://developer.android.com/reference/java/util/jar/Pack200#newUnpacker()() ` Obtain new instance of a class that implements Unpacker. |

### Inherited methods

From class ` https://developer.android.com/reference/java/lang/Object ` ` https://developer.android.com/reference/java/lang/Object` ` https://developer.android.com/reference/java/lang/Object#clone()() `

Creates and returns a copy of this object.
` boolean` ` https://developer.android.com/reference/java/lang/Object#equals(java.lang.Object)(https://developer.android.com/reference/java/lang/Object obj) `

Indicates whether some other object is "equal to" this one.
` void` ` https://developer.android.com/reference/java/lang/Object#finalize()() `

Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.
` final https://developer.android.com/reference/java/lang/Class<?>` ` https://developer.android.com/reference/java/lang/Object#getClass()() `

Returns the runtime class of this `Object`.
` int` ` https://developer.android.com/reference/java/lang/Object#hashCode()() `

Returns a hash code value for the object.
` final void` ` https://developer.android.com/reference/java/lang/Object#notify()() `

Wakes up a single thread that is waiting on this object's monitor.
` final void` ` https://developer.android.com/reference/java/lang/Object#notifyAll()() `

Wakes up all threads that are waiting on this object's monitor.
` https://developer.android.com/reference/java/lang/String` ` https://developer.android.com/reference/java/lang/Object#toString()() `

Returns a string representation of the object.
` final void` ` https://developer.android.com/reference/java/lang/Object#wait(long,%20int)(long timeoutMillis, int nanos) `

Causes the current thread to wait until it is awakened, typically by being *notified* or *interrupted*, or until a certain amount of real time has elapsed.
` final void` ` https://developer.android.com/reference/java/lang/Object#wait(long)(long timeoutMillis) `

Causes the current thread to wait until it is awakened, typically by being *notified* or *interrupted*, or until a certain amount of real time has elapsed.
` final void` ` https://developer.android.com/reference/java/lang/Object#wait()() `

Causes the current thread to wait until it is awakened, typically by being *notified* or *interrupted*.

## Public methods

### newPacker

Added in [API level 1](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static Pack200.Packer 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.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/jar/Pack200.Packer` | A newly allocated Packer engine. <br /> |

### newUnpacker

Added in [API level 1](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static Pack200.Unpacker 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.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/jar/Pack200.Unpacker` | A newly allocated Unpacker engine. <br /> |