本文實例講述了從Java的jar文件中讀取數據的方法。分享給大家供大家參考。具體如下:
Java 檔案(Java Archive, JAR) 文件是基於Java 技術的打包方案。它們允許開發人員把所有相關的內容(.class、圖片、聲音和支持文件等) 打包到一個單一的文件中。 JAR 文件格式支持壓縮、身份驗證和版本,以及許多其它特性。
從JAR 文件中得到它所包含的文件內容是件棘手的事情,但也不是不可以做到。這篇技巧就將告訴你如何從JAR 文件中取得一個文件。我們會先取得這個JAR 文件中的文件目錄,然後讀取指定的文件。
如果你熟悉常見的ZIP 格式,你會發現JAR 文件和它區別不大。 JAR 文件提供了一個把多個文件打包到一個文件中的方法,而且被打包的每個文件都可以分別壓縮。 JAR 文件可以添加一個被稱為manifest 的東西,它們允許開發人員添加與內容有關的其它信息。例如,manifest 可以指明由JAR 文件中的哪一個文件開始運行應用程序,或者指定這個庫的版本等。
Java 2 SDK 標準版提供了一個jar 工具,你可以通過它在控制台下讀寫JAR 文件。然後,也許有些時候你想在你的程序中讀寫JAR 文件。 (這篇技巧僅涉及了在程序中讀JAR 文件的內容。)非常高興,你可以做到,並且不需要考慮解壓的問題,因為類庫已經幫你處理了。你要用到的類都在java.util.jar 包中。這裡要用到的主要的類是JarFile 類,它是一個.jar 文件自身的引用。其中的每個文件則由JarEntry 引用。
現在開始,傳遞一個參數給JarFile 的構造函數創建一個JarFile 實例,這個參數可能是String 也可以是File,它是一個.jar 文件的位置:
複製代碼代碼如下:JarFile jarFile = new JarFile("thefile.jar");
或者復制代碼代碼如下:File file = new File("thefile.jar");
JarFile jarFile = new JarFile(file);
它還有其它一些構造函數,支持身份驗證和標記文件為刪除。不過這裡不會涉及到這些構造函數。
在你得到一個JAR 文件的引用之後,你就可以讀了其內容的目錄了。 JarFile 的entries 方法返回一個所有條目的Enumeration 對象,你還可以從manifest 文件中獲得它的屬性、身份驗證信息以及其它的信息,如條目的名稱和大小。
// 譯者註:enum 在Java 5.0 中是關鍵字,所以該例在5.0 中應該編譯失敗// 但英文原著發表於Java 5.0 出現之前,所以可以使用enum 作變量名// 為忠於原著,這裡未作修改Enumeration enum = jarFile.entries();while (enum.hasMoreElements()) { process(enum.nextElement());}
以前提到過,每個個體都是一個JarEntry。這個類有一些諸如getName、getSize 和getCompressedSize 的方法。
讓我們舉例說明如何在程序中使用這些特性。下面的程序顯示JAR 文件的內容列表及各項的名稱、大小和壓縮後的大小。 (這很類似於使用帶"t" 和"v" 參數的jar 命令。)
import java.io.*;import java.util.*;import java.util.jar.*;public class JarDir { public static void main (String args[]) throws IOException { if (args.length != 1) { System.out.println("Please provide a JAR filename"); System.exit(-1); } JarFile jarFile = new JarFile(args[0]); Enumeration enum = jarFile.entries(); while (enum.hasMoreElements ()) { process(enum.nextElement()); } } private static void process(Object obj) { JarEntry entry = (JarEntry)obj; String name = entry.getName(); long size = entry.getSize(); long compressedSize = entry.getCompressedSize(); System.out.println(name + " " + size + " " + compressedSize); }}
如果你用J2SE 1.4.1 中的jce.jar 來試驗上述的JarDir 程序,你應該看像下面那樣的輸出(在... 處應該顯示更多文件):
META-INF/MANIFEST.MF 5315 1910META-INF/4JCEJARS.SF 5368 1958META-INF/4JCEJARS.DSA 2207 1503META-INF/ 0 2javax/ 0 0javax/crypto/ 0 0javax/crypto/interfaces/ 0 0javax/crypto/interfaces/ DHKey.class 209 185javax/crypto/interfaces/DHPublicKey.class 265 215javax/crypto/interfaces/DHPrivateKey.class 267 215javax/crypto/interfaces/PBEKey.class 268 224javax/crypto/SecretKey.class 167 155...
注意輸入內容頂部包含META-INF 的那幾行,這是menifest 和安全驗證信息。其中大小為0 的項不是文件,而是目錄。
要真正從JAR 文件中讀取文件內容,你必須獲得相應條目的InputStream。這不同於JarEntry。 JarEntry 僅包括了入口信息,卻並未包含實際的內容。這很像File 和FileInputSteram 的區別。只訪問File,永遠不會打開相應的文件,它只讀取在目錄中的信息。下面告訴你如何從一個條目得到InputStream:
複製代碼代碼如下:InputStream input = jarFile.getInputStream(entry);
得到輸入流之後,你只需要像讀其它流一樣讀它就行了。如果是一個文本流,要記得使用一個Reader 來從流中獲取字符。而對於字節流,如圖片,則只好直接讀取。
下面的程序演示了從一個JAR 文件中讀取內容。運行程序時,需要指定要從JAR 文件中讀取的文件名,這個文件必須是文本文件類型。
import java.io.*;import java.util.jar.*;public class JarRead { public static void main (String args[]) throws IOException { if (args.length != 2) { System.out.println(" Please provide a JAR filename and file to read"); System.exit(-1); } JarFile jarFile = new JarFile(args[0]); JarEntry entry = jarFile.getJarEntry(args[1]); InputStream input = jarFile .getInputStream(entry); process(input); jarFile.close(); } private static void process(InputStream input) throws IOException { InputStreamReader isr = new InputStreamReader(input); BufferedReader reader = new BufferedReader(isr); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } reader.close(); }}
假設你有一個名為myfiles.jar 的JAR 文件,其中有一個名為spider.txt 文本文件,再假設那個pider.txt 包含如下文本:
The itsy bitsy spider Ran up the water spoutDown came the rain andWashed the spider out
運行下面的命令以顯示JAR 文件中該文本文件的內容:
複製代碼代碼如下:java JarRead myfiles.jar spider.txt
希望本文所述對大家的java程序設計有所幫助。