摘要<-- begin body text -->多數 Java 程序員都非常清楚使用 JAR 文件將組成 Java 解決方案的各種資源(即 .class 文件、聲音和圖像)打包的優點。(假如您不熟悉 JAR 文件,請參閱后文的參考資源部分。)剛開始使用 JAR 文件的人常問的一個問題是:“如何從 JAR 文件中提取圖像呢?”本文將回答這個問題,并會提供一個類,這個類使從 JAR 文件中提取任何資源變得非常簡單!
將一類 Java 資源打包在一個 Java ARchive (JAR) 文件中是縮短下載時間、增強安全性和增強可治理性的極好方法。這篇技巧說明如何很輕易地從 JAR 文件中提取資源以供您自己使用。
加載 GIF 圖像
假定我們有一個 JAR 文件,其中包含我們的應用程序要使用的一組 .gif 圖像。下面就是使用 JarResources 訪問 JAR 文件中的圖像文件的方法: 
    JarResources jar = new JarResources ("Images.jar");
    Image logo =
 Toolkit.getDefaultToolkit().createImage (jar.getResource ("logo.gif");
這段代碼說明我們可以創建一個 JarResources 對象,并將其初始化為包含我們要使用的資源的 JAR 文件 -- Images.jar。隨后我們使用 JarResources 的 getResource() 方法將來自 logo.gif 文件的原始數據提供給 AWT Toolkit 的 createImage() 方法。 
命名說明
JarResource 是一個非常簡單的示例,它說明了如何使用 Java 1.1 所提供的各種功能來處理 JAR 和 zip 檔案文件。 
關于命名的簡要說明。Java 中的歸檔支持實際上是以流行的 zip 歸檔格式為起點的(請參閱 "Java Tip 21: Use archive files to speed up applet loading")。因此,在最初實現處理檔案文件的 Java 支持時,所有類文件以及諸如此類的東西并未放在 java.util.zip 包中;這些類通常以 "Zip" 開頭。但在轉向 Java 1.1 時,功能已發生了變化,檔案文件的名稱也更具有 Java 特征。因此,現在我們稱之為 JAR 文件的文件基本上是 zip 文件。 
工作方式JarResources 類的重要數據域用來跟蹤和存儲指定 JAR 文件的內容: 
public final class JarResources {
   public boolean debugOn=false;
   PRivate Hashtable htSizes=new Hashtable(); 
   private Hashtable htJarContents=new Hashtable();
   private String jarFileName;
這樣,該類的實例化設置 JAR 文件的名稱,然后轉到 init() 方法完成全部實際工作。 
   public JarResources(String jarFileName) {
      this.jarFileName=jarFileName;
      init();
   }
現在,init() 方法只將指定 JAR 文件的整個內容加載到一個 hashtable(通過資源名訪問)中。 
這是一個相當有用的方法,下面我們對它作進一步的分析。ZipFile 類為我們提供了對 JAR/zip 檔案頭信息的基本訪問方法。這類似于文件系統中的目錄信息。下面我們列出 ZipFile 中的所有條目,并用檔案中每個資源的大小添充 htSizes hashtable: 
   private void init() {
      try {
          ZipFile zf=new ZipFile(jarFileName);
          Enumeration e=zf.entries();
          while (e.hasMoreElements()) {
              ZipEntry ze=(ZipEntry)e.nextElement();
              if (debugOn) {
                 System.out.println(dumpZipEntry(ze));
              }
              htSizes.put(ze.getName(),new Integer((int)ze.getSize()));
          }
          zf.close();
 
  | 
新聞熱點
疑難解答