程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 從Java的jar文件中讀取數據的辦法

從Java的jar文件中讀取數據的辦法

編輯:關於JAVA

從Java的jar文件中讀取數據的辦法。本站提示廣大學習愛好者:(從Java的jar文件中讀取數據的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是從Java的jar文件中讀取數據的辦法正文


本文實例講述了從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  1910
META-INF/4JCEJARS.SF  5368  1958
META-INF/4JCEJARS.DSA  2207  1503
META-INF/    0    2
javax/ 0    0
javax/crypto/  0    0
javax/crypto/interfaces/    0    0
javax/crypto/interfaces/DHKey.class   209   185
javax/crypto/interfaces/DHPublicKey.class    265   215
javax/crypto/interfaces/DHPrivateKey.class   267   215
javax/crypto/interfaces/PBEKey.class  268   224
javax/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 spout
Down came the rain and
Washed the spider out 

運轉上面的敕令以顯示 JAR 文件中該文本文件的內容:

java JarRead myfiles.jar spider.txt

願望本文所述對年夜家的java法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved