當前位置:才華齋>計算機>java語言>

Java的jar檔案中讀取資料的方法

java語言 閱讀(1.6W)

本文例項講述了從Java的jar檔案中讀取資料的方法。分享給大家供大家參考。具體如下:

Java的jar檔案中讀取資料的方法

Java 檔案 (Java Archive, JAR) 檔案是基於 Java 技術的打包方案。它們允許開發人員把所有相關的內容 (s、圖片、聲音和支援檔案等) 打包到一個單一的檔案中。JAR 檔案格式支援壓縮、身份驗證和版本,以及許多其它特性。

從 JAR 檔案中得到它所包含的檔案內容是件棘手的事情,但也不是不可以做到。這篇技巧就將告訴你如何從 JAR 檔案中取得一個檔案。我們會先取得這個 JAR 檔案中的檔案目錄,然後讀取指定的檔案。

如果你熟悉常見的 ZIP 格式,你會發現 JAR 檔案和它區別不大。JAR 檔案提供了一個把多個檔案打包到一個檔案中的方法,而且被打包的每個檔案都可以分別壓縮。JAR 檔案可以新增一個被稱為 manifest 的東西,它們允許開發人員新增與內容有關的其它資訊。例如,manifest 可以指明由 JAR 檔案中的哪一個檔案開始執行應用程式,或者指定這個庫的版本等。

Java 2 SDK 標準版提供了一個 jar 工具,你可以通過它在控制檯下讀寫 JAR 檔案。然後,也許有些時候你想在你的'程式中讀寫 JAR 檔案。(這篇技巧僅涉及了在程式中讀 JAR 檔案的內容。)非常高興,你可以做到,並且不需要考慮解壓的問題,因為類庫已經幫你處理了。你要用到的類都在 包中。這裡要用到的主要的類是 JarFile 類,它是一個 檔案自身的引用。其中的每個檔案則由 JarEntry 引用。

現在開始,傳遞一個引數給 JarFile 的建構函式建立一個 JarFile 例項,這個引數可能是 String 也可以是 File,它是一個 檔案的位置:

複製程式碼 程式碼如下:JarFile jarFile = new JarFile("");

或者

複製程式碼 程式碼如下:File file = new File("");

JarFile jarFile = new JarFile(file);

它還有其它一些建構函式,支援身份驗證和標記檔案為刪除。不過這裡不會涉及到這些建構函式。

在你得到一個 JAR 檔案的引用之後,你就可以讀了其內容的目錄了。JarFile 的 entries 方法返回一個所有條目的 Enumeration 物件,你還可以從 manifest 檔案中獲得它的屬性、身份驗證資訊以及其它的資訊,如條目的名稱和大小。

// 譯者注:enum 在 Java 5.0 中是關鍵字,所以該例在 5.0 中應該編譯失敗// 但英文原著發表於 Java 5.0 出現之前,所以可以使用 enum 作變數名// 為忠於原著,這裡未作修改Enumeration enum = ies();while (oreElements()) { process(Element());}

以前提到過,每個個體都是一個 JarEntry。這個類有一些諸如 getName、getSize 和getCompressedSize 的方法。

讓我們舉例說明如何在程式中使用這些特性。下面的程式顯示 JAR 檔案的內容列表及各項的名稱、大小和壓縮後的大小。(這很類似於使用帶 "t" 和 "v" 引數的 jar 命令。)

import .*;import .*;import .*;public class JarDir { public static void main (String args[]) throws IOException { if (th != 1) { tln("Please provide a JAR filename"); (-1); } JarFile jarFile = new JarFile(args[0]); Enumeration enum = ies(); while (oreElements()) { process(Element()); } } private static void process(Object obj) { JarEntry entry = (JarEntry)obj; String name = ame(); long size = ize(); long compressedSize = ompressedSize(); tln(name + " " + size + " " + compressedSize); }}

如果你用 J2SE 1.4.1 中的 來試驗上述的 JarDir 程式,你應該看像下面那樣的輸出 (在 ... 處應該顯示更多檔案):

META-INF/ 5315 1910META-INF/ 5368 1958META-INF/ 2207 1503META-INF/ 0 2javax/ 0 0javax/crypto/ 0 0javax/crypto/interfaces/ 0 0javax/crypto/interfaces/s 209 185javax/crypto/interfaces/s 265 215javax/crypto/interfaces/s 267 215javax/crypto/interfaces/s 268 224javax/crypto/s 167 155...

注意輸入內容頂部包含 META-INF 的那幾行,這是 menifest 和安全驗證資訊。其中大小為 0 的項不是檔案,而是目錄。

要真正從 JAR 檔案中讀取檔案內容,你必須獲得相應條目的 InputStream。這不同於 JarEntry。JarEntry 僅包括了入口資訊,卻並未包含實際的內容。這很像 File 和 FileInputSteram 的區別。只訪問 File,永遠不會開啟相應的檔案,它只讀取在目錄中的資訊。下面告訴你如何從一個條目得到 InputStream:

複製程式碼 程式碼如下:InputStream input = nputStream(entry);

得到輸入流之後,你只需要像讀其它流一樣讀它就行了。如果是一個文字流,要記得使用一個 Reader 來從流中獲取字元。而對於位元組流,如圖片,則只好直接讀取。

下面的程式演示了從一個 JAR 檔案中讀取內容。執行程式時,需要指定要從 JAR 檔案中讀取的檔名,這個檔案必須是文字檔案型別。

import .*;import .*;public class JarRead { public static void main (String args[]) throws IOException { if (th != 2) { tln("Please provide a JAR filename and file to read"); (-1); } JarFile jarFile = new JarFile(args[0]); JarEntry entry = arEntry(args[1]); InputStream input = nputStream(entry); process(input); e(); } private static void process(InputStream input) throws IOException { InputStreamReader isr = new InputStreamReader(input); BufferedReader reader = new BufferedReader(isr); String line; while ((line = Line()) != null) { tln(line); } e(); }}

假設你有一個名為 的 JAR 檔案,其中有一個名為 文字檔案,再假設那個 包含如下文字:

The itsy bitsy spider Ran up the water spoutDown came the rain andWashed the spider out

執行下面的命令以顯示 JAR 檔案中該文字檔案的內容:

複製程式碼 程式碼如下:java JarRead

希望本文所述對大家的java程式設計有所幫助。