Stay organized with collections
Save and categorize content based on your preferences.
Pack200
abstract class Pack200
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:
<code>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();
}
</code>
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 for more details and techniques.
Unless otherwise noted, passing a null argument to a constructor or method in this class will cause a NullPointerException
to be thrown.
Summary
Nested classes |
abstract |
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.
|
abstract |
The unpacker engine converts the packed stream to a JAR file.
|
Public methods |
open static Pack200.Packer! |
Obtain new instance of a class that implements Packer.
|
open static Pack200.Unpacker! |
Obtain new instance of a class that implements Unpacker.
|
Public methods
newPacker
open static fun newPacker(): Pack200.Packer!
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.
newUnpacker
open static fun newUnpacker(): Pack200.Unpacker!
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.
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2025-02-10 UTC.
[null,null,["Last updated 2025-02-10 UTC."],[],[],null,["# Pack200\n\nAdded in [API level 1](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels)\n\nPack200\n=======\n\n```\nabstract class Pack200\n```\n\n|---|----------------------------|\n| [kotlin.Any](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html) ||\n| ↳ | [java.util.jar.Pack200](#) |\n\nTransforms a JAR file to or from a packed stream in Pack200 format. Please refer to Network Transfer Format JSR 200 Specification at \u003chttp://jcp.org/aboutJava/communityprocess/review/jsr200/index.html\u003e\n\nTypically 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.\n\nHere is an example using packer and unpacker: \n\n```kotlin\n\u003ccode\u003eimport java.util.jar.Pack200;\n import java.util.jar.Pack200.*;\n ...\n // Create the Packer object\n Packer packer = Pack200.newPacker();\n \n // Initialize the state by setting the desired properties\n Map p = packer.properties();\n // take more time choosing codings for better compression\n p.put(Packer.EFFORT, \"7\"); // default is \"5\"\n // use largest-possible archive segments (>10% better compression).\n p.put(Packer.SEGMENT_LIMIT, \"-1\");\n // reorder files for better compression.\n p.put(Packer.KEEP_FILE_ORDER, Packer.FALSE);\n // smear modification times to a single value.\n p.put(Packer.MODIFICATION_TIME, Packer.LATEST);\n // ignore all JAR deflation requests,\n // transmitting a single request to use \"store\" mode.\n p.put(Packer.DEFLATE_HINT, Packer.FALSE);\n // discard debug attributes\n p.put(Packer.CODE_ATTRIBUTE_PFX+\"LineNumberTable\", Packer.STRIP);\n // throw an error if an attribute is unrecognized\n p.put(Packer.UNKNOWN_ATTRIBUTE, Packer.ERROR);\n // pass one class file uncompressed:\n p.put(Packer.PASS_FILE_PFX+0, \"mutants/Rogue.class\");\n try {\n JarFile jarFile = new JarFile(\"/tmp/testref.jar\");\n FileOutputStream fos = new FileOutputStream(\"/tmp/test.pack\");\n // Call the packer\n packer.pack(jarFile, fos);\n jarFile.close();\n fos.close();\n \n File f = new File(\"/tmp/test.pack\");\n FileOutputStream fostream = new FileOutputStream(\"/tmp/test.jar\");\n JarOutputStream jostream = new JarOutputStream(fostream);\n Unpacker unpacker = Pack200.newUnpacker();\n // Call the unpacker\n unpacker.unpack(f, jostream);\n // Must explicitly close the output.\n jostream.close();\n } catch (IOException ioe) {\n ioe.printStackTrace();\n }\n \u003c/code\u003e\n```\n\nA 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.\n\nUnless otherwise noted, passing a null argument to a constructor or method in this class will cause a [NullPointerException](../../lang/NullPointerException.html#) to be thrown.\n\nSummary\n-------\n\n| Nested classes ||\n|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| abstract | [Packer](/reference/kotlin/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. |\n| abstract | [Unpacker](/reference/kotlin/java/util/jar/Pack200.Unpacker) The unpacker engine converts the packed stream to a JAR file. |\n\n| Public methods ||\n|-----------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|\n| open static [Pack200.Packer](/reference/kotlin/java/util/jar/Pack200.Packer)! | [newPacker](#newPacker())`()` Obtain new instance of a class that implements Packer. |\n| open static [Pack200.Unpacker](/reference/kotlin/java/util/jar/Pack200.Unpacker)! | [newUnpacker](#newUnpacker())`()` Obtain new instance of a class that implements Unpacker. |\n\nPublic methods\n--------------\n\n### newPacker\n\nAdded in [API level 1](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels) \n\n```\nopen static fun newPacker(): Pack200.Packer!\n```\n\nObtain new instance of a class that implements Packer.\n\n- 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.\n- If an implementation has not been specified with the system property, then the system-default implementation class is instantiated, and the result is returned.\n\n\u003cbr /\u003e\n\nNote: 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.\n\n| Return ||\n|-------------------------------------------------------------------|----------------------------------|\n| [Pack200.Packer](/reference/kotlin/java/util/jar/Pack200.Packer)! | A newly allocated Packer engine. |\n\n### newUnpacker\n\nAdded in [API level 1](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels) \n\n```\nopen static fun newUnpacker(): Pack200.Unpacker!\n```\n\nObtain new instance of a class that implements Unpacker.\n\n- 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.\n- If an implementation has not been specified with the system property, then the system-default implementation class is instantiated, and the result is returned.\n\n\u003cbr /\u003e\n\nNote: 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.\n\n| Return ||\n|-----------------------------------------------------------------------|------------------------------------|\n| [Pack200.Unpacker](/reference/kotlin/java/util/jar/Pack200.Unpacker)! | A newly allocated Unpacker engine. |"]]