|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
public static interface Pack200.Packer
打包器引擎把各種轉換應用到輸入 JAR 檔案,從而可以通過壓縮器(如 gzip 或 zip)高度壓縮打包串流。可使用 Pack200.newPacker()
獲得該引擎的實例。高度壓縮是通過使用 JSR 200 規範中描述的大量技術來實作的。一些技術包括排序、重排序和常數池的共處。
根據下面所述的打包引擎屬性,將打包引擎初始化為初始狀態。可以通過獲取引擎屬性(使用 properties()
)並在映射上存儲已修改屬性來操作該初始狀態。資源檔案根本不做任何改動即可通過。類別檔案將不會包含相同的位元組,因為解包器可以隨意改變次要類別檔案的特性,比如常數池的順序。但是類別檔案在語義上將是相同的,這在下面網址的 Java Virtual Machine Specification 中作了規定:http://java.sun.com/docs/books/vmspec/html/ClassFile.doc.html。
預設情況下,打包器不改變 JAR 元素的順序。而且不改變每個 JAR 元素的修改時間和壓縮提示。任何其他 ZIP 存檔資訊(如給出 Unix 檔案權限的額外屬性)將會丟失。
注意,打包和解包 JAR 通常將修改 JAR 中類別檔案的位元組內容。這意味著打包和解包通常將使依賴於 JAR 元素位元組圖像的任何數位簽章無效。為了簽章並打包 JAR,您必須首先打包和解包 JAR 來“規範化”它,然後計算解包後 JAR 元素上簽章,最後重新打包簽章的 JAR。打包步驟應該準確地使用相同的選項,可能還需要把段範圍設置為 "-1",以防止在類別檔案大小有所改變時段邊界的意外變化。
(其工作原理如下:打包器對任何類別檔案結構的任何重新排序是冪等的,因此,第二次打包不會改變第一次打包所產生的順序。而且,JSR 200 規範保證解包器可為存檔元素的任何給定傳輸順序產生指定的位元組圖像。)
為了維護向後相容性,如果輸入 JAR 檔案僅由 1.5(或更低版本)類別檔案組成,則產生 1.5 相容的套件檔案。否則,產生 1.6 相容的 pack200 檔案。
欄位摘要 | |
---|---|
static String |
CLASS_ATTRIBUTE_PFX
當與類別屬性名稱連在一起時,使用 JSR 200 規範中指定的佈局語言指出該屬性的格式。 |
static String |
CODE_ATTRIBUTE_PFX
當與程式碼屬性名稱連在一起時,指出該屬性的格式。 |
static String |
DEFLATE_HINT
如果將此屬性設置為 TRUE 或 FALSE ,則打包器將在輸出存檔中設置相應的壓縮提示,並且不傳輸存檔元素的單個壓縮提示。 |
static String |
EFFORT
如果將此屬性設置為單個十進制數字,則打包器將在壓縮存檔時使用指定壓縮級別。 |
static String |
ERROR
字元串 "error",某些屬性的可能值。 |
static String |
FALSE
字元串 "false",某些屬性的可能值。 |
static String |
FIELD_ATTRIBUTE_PFX
當與欄位屬性名稱連在一起時,指出該屬性的格式。 |
static String |
KEEP
字元串 "keep",某些屬性的可能值。 |
static String |
KEEP_FILE_ORDER
如果將此屬性設置為 TRUE ,則打包器將按它們在源存檔中的原始順序傳輸所有元素。 |
static String |
LATEST
字元串 "latest",某些屬性的可能值。 |
static String |
METHOD_ATTRIBUTE_PFX
當與方法屬性名稱連在一起時,指出該屬性的格式。 |
static String |
MODIFICATION_TIME
如果將此屬性設置為特殊的字元串 LATEST ,則打包器將嘗試在原始存檔中的所有可用條目中確定最後修改時間,或者確定每個段中所有可用條目的最後修改時間。 |
static String |
PASS
字元串 "pass",某些屬性的可能值。 |
static String |
PASS_FILE_PFX
指出檔案應該按位元組傳遞(無壓縮)。 |
static String |
PROGRESS
解包器的百分比進度,由解包器定期更新。 |
static String |
SEGMENT_LIMIT
此屬性是一個數字,給出了每個存檔段的估計目標大小 N(以位元組為單位)。 |
static String |
STRIP
字元串 "strip",某些屬性的可能值。 |
static String |
TRUE
字元串 "true",某些屬性的可能值。 |
static String |
UNKNOWN_ATTRIBUTE
指出遇到包含有未知屬性的類別檔案時所採取的行動。 |
方法摘要 | |
---|---|
void |
addPropertyChangeListener(PropertyChangeListener listener)
為屬性映射上的 PropertyChange 事件註冊一個偵聽器。 |
void |
pack(JarFile in,
OutputStream out)
接收 JarFile 並將其轉換為 Pack200 存檔。 |
void |
pack(JarInputStream in,
OutputStream out)
接收 JarInputStream 並將其轉換成 Pack200 存檔。 |
SortedMap<String,String> |
properties()
獲取此引擎屬性集。 |
void |
removePropertyChangeListener(PropertyChangeListener listener)
移除由 addPropertyChangeListener(java.beans.PropertyChangeListener) 所添加的 PropertyChange 事件偵聽器。 |
欄位詳細資訊 |
---|
static final String SEGMENT_LIMIT
作為特殊情況,值 -1 將產生使用所有輸入檔案的單個大段,而值 0 將為每個類別產生一個段。較大的存檔段將帶來較少的碎片和更好的壓縮,但處理它們要求更多的記憶體。
每個段的大小是通過計算段中要傳輸的每個輸入檔案的大小,以及它的名稱和其他要傳輸的屬性的大小來估算的。
預設為 1000000(1 百萬位元組)。這允許在一個段中傳輸中等大小的輸入 JAR 檔案。它也限制了打包器和解包器的記憶體要求。
如果沒有此限制,打包一個 10 Mb 的 JAR 通常要小 10%,但打包器可能要求較大的 Java 堆積(heap)空間(大約是段範圍的 10 倍)。
static final String KEEP_FILE_ORDER
TRUE
,則打包器將按它們在源存檔中的原始順序傳輸所有元素。
如果將其設置為 FALSE
,則打包器可能重新排序元素,並且移除攜帶無用資訊(針對 Java 應用程序來說)的 JAR 目錄條目。(通常這支持更好的壓縮。)
預設為 TRUE
,這保存了輸入資訊,但可能不必要地增大了所傳輸的存檔。
static final String EFFORT
特殊值 0 指示打包器直接複製原始的 JAR 檔案(無壓縮)。JSR 200 標準要求任何解包器將此特殊情況作為直接傳輸整個存檔來理解。
預設為 5,花費適量的時間來產生合理的壓縮。
static final String DEFLATE_HINT
TRUE
或 FALSE
,則打包器將在輸出存檔中設置相應的壓縮提示,並且不傳輸存檔元素的單個壓縮提示。
如果將此屬性設置為特殊字元串 KEEP
,則打包器將嘗試確定輸入存檔中每個可用元素的單個壓縮提示,並單獨傳輸此提示。
預設為 KEEP
,這保存了輸入資訊,但可能不必要地增大了所傳輸的存檔。
這取決於解包器實作在提示上採取的行動,以便合適地壓縮得到的未打包 jar 的元素。
ZIP 或 JAR 元素的壓縮提示指出元素是壓縮的還是直接存儲的。
static final String MODIFICATION_TIME
LATEST
,則打包器將嘗試在原始存檔中的所有可用條目中確定最後修改時間,或者確定每個段中所有可用條目的最後修改時間。此單值將作為段的一部分傳輸,並應用到每個段 (SEGMENT_LIMIT
) 的所有條目。
這或多或少可以減少存檔的傳輸大小,其代價是將所有已安裝檔案設置為單一日期。
如果將此屬性設置為特殊字元串 KEEP
,則打包器傳輸每個輸入元素的單獨修改時間。
預設為 KEEP
,這保存了輸入資訊,但可能不必要地增大了所傳輸的存檔。
這取決於解包器實作所採取的行動,以便合適地設置其輸出檔案中每個元素的修改時間。
SEGMENT_LIMIT
,
常數欄位值static final String PASS_FILE_PFX
除了用 JAR 檔案分隔符 '/' 替代系統檔案分隔符以外,無任何路徑名轉換。
得到的檔案名必須正好比對其在 JAR 檔案中出現的字元串。
如果屬性值是一個目錄名稱,那麼還將傳遞該目錄下的所有檔案。
範例:
Map p = packer.properties();
p.put(PASS_FILE_PFX+0, "mutants/Rogue.class");
p.put(PASS_FILE_PFX+1, "mutants/Wolverine.class");
p.put(PASS_FILE_PFX+2, "mutants/Storm.class");
# Pass all files in an entire directory hierarchy:
p.put(PASS_FILE_PFX+3, "police/");
.
static final String UNKNOWN_ATTRIBUTE
ERROR
、STRIP
和 PASS
。
字元串 ERROR
意味著整體打包操作將失敗,並拋出 IOException
型別的異常。字元串 STRIP
意味著該屬性將被刪除。字元串 PASS
意味著整個類別檔案將在無壓縮下通過(就像它是一個資源檔案一樣),並有合適的警告。這是此屬性的預設值。
範例:
Map p = pack200.getProperties();
p.put(UNKNOWN_ATTRIBUTE, ERROR);
p.put(UNKNOWN_ATTRIBUTE, STRIP);
p.put(UNKNOWN_ATTRIBUTE, PASS);
static final String CLASS_ATTRIBUTE_PFX
例如,此選項的效果內置於:pack.class.attribute.SourceFile=RUH
。
還允許特殊字元串 ERROR
、STRIP
和 PASS
,與 UNKNOWN_ATTRIBUTE
具有相同的含義。這提供了一種方式,讓使用者可以請求按位拒絕、清除或傳遞特定的屬性(不進行類別壓縮)。
下面的程式碼可用於支持 JCOV 屬性:
Map p = packer.properties();
p.put(CODE_ATTRIBUTE_PFX+"CoverageTable", "NH[PHHII]");
p.put(CODE_ATTRIBUTE_PFX+"CharacterRangeTable", "NH[PHPOHIIH]");
p.put(CLASS_ATTRIBUTE_PFX+"SourceID", "RUH");
p.put(CLASS_ATTRIBUTE_PFX+"CompilationID", "RUH");
下面的程式碼可用於清除除錯屬性:
Map p = packer.properties();
p.put(CODE_ATTRIBUTE_PFX+"LineNumberTable", STRIP);
p.put(CODE_ATTRIBUTE_PFX+"LocalVariableTable", STRIP);
p.put(CLASS_ATTRIBUTE_PFX+"SourceFile", STRIP);
static final String FIELD_ATTRIBUTE_PFX
pack.field.attribute.Deprecated=
。還允許特殊字元串 ERROR
、STRIP
和 PASS
。
CLASS_ATTRIBUTE_PFX
,
常數欄位值static final String METHOD_ATTRIBUTE_PFX
pack.method.attribute.Exceptions=NH[RCH]
。還允許特殊字元串 ERROR
、STRIP
和 PASS
。
CLASS_ATTRIBUTE_PFX
,
常數欄位值static final String CODE_ATTRIBUTE_PFX
pack.code.attribute.LocalVariableTable=NH[PHOHRUHRSHH]
。還允許特殊字元串 ERROR
、STRIP
和 PASS
。
CLASS_ATTRIBUTE_PFX
,
常數欄位值static final String PROGRESS
PropertyChangeListener
觀察此屬性。
至少,解包器必須在打包操作開始時把進度設置為 0,在結束時把進度設置為 100。
addPropertyChangeListener(java.beans.PropertyChangeListener)
,
常數欄位值static final String KEEP
DEFLATE_HINT
,
MODIFICATION_TIME
,
常數欄位值static final String PASS
UNKNOWN_ATTRIBUTE
,
CLASS_ATTRIBUTE_PFX
,
FIELD_ATTRIBUTE_PFX
,
METHOD_ATTRIBUTE_PFX
,
CODE_ATTRIBUTE_PFX
,
常數欄位值static final String STRIP
UNKNOWN_ATTRIBUTE
,
CLASS_ATTRIBUTE_PFX
,
FIELD_ATTRIBUTE_PFX
,
METHOD_ATTRIBUTE_PFX
,
CODE_ATTRIBUTE_PFX
,
常數欄位值static final String ERROR
UNKNOWN_ATTRIBUTE
,
CLASS_ATTRIBUTE_PFX
,
FIELD_ATTRIBUTE_PFX
,
METHOD_ATTRIBUTE_PFX
,
CODE_ATTRIBUTE_PFX
,
常數欄位值static final String TRUE
KEEP_FILE_ORDER
,
DEFLATE_HINT
,
常數欄位值static final String FALSE
KEEP_FILE_ORDER
,
DEFLATE_HINT
,
常數欄位值static final String LATEST
MODIFICATION_TIME
,
常數欄位值方法詳細資訊 |
---|
SortedMap<String,String> properties()
屬性映射可能包含指定和預設屬性的預定義實作。鼓勵使用者在修改已存在的屬性前閱讀該資訊,並完全理解其含意。
特定實作的屬性是用與實作者相關的套件名稱作前綴的,以 com. 或類似前綴開頭。以 pack. 和 unpack. 開頭的所有屬性名稱保留給此 API 使用。
未知屬性可以用未指定的錯誤忽略或拒絕,並且無效的條目可能導致拋出未指定的錯誤。
返回的映射實作了所有可選的 SortedMap
操作。
void pack(JarFile in, OutputStream out) throws IOException
關閉其輸入,但並不關閉其輸出。(Pack200 存檔是可添加的。)
in
- 一個 JarFileout
- 一個 OutputStream
IOException
- 如果遇到錯誤void pack(JarInputStream in, OutputStream out) throws IOException
關閉其輸入,但並不關閉其輸出。(Pack200 存檔是可添加的。)
對於 JAR 清單檔案及其包含的目錄,修改時間和壓縮提示屬性是不可用的。
in
- 一個 JarInputStreamout
- 一個 OutputStream
IOException
- 如果遇到錯誤MODIFICATION_TIME
,
DEFLATE_HINT
void addPropertyChangeListener(PropertyChangeListener listener)
listener
- 更改屬性時要調用的物件。properties()
,
PROGRESS
void removePropertyChangeListener(PropertyChangeListener listener)
addPropertyChangeListener(java.beans.PropertyChangeListener)
所添加的 PropertyChange 事件偵聽器。
listener
- 要移除的 PropertyChange 偵聽器。addPropertyChangeListener(java.beans.PropertyChangeListener)
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。