熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

從JAR文件中讀取文件

2013-11-23 19:23:52  來源: Java核心技術 

    
  作者John Zukowski
  翻譯Roger Sun
  原文來源
  #
  譯文地址
  bin/forum/topiccgi?forum=&topic=
  
  ==============================================
  
  JAR文件是打包基於JAVA技術的解決方案的標准方法它允許開發者將所有相關內容(class圖片聲音及所有支持的文件)打包到一個文件中JAR格式支持壓縮認證版本號及其他很多特性
  
  從JAR文件中讀取文件是很麻煩的事情但是也不一定全是這樣本文將告訴你如何從JAR文件中讀取文件首先得到JAR文件中的文件目錄然後在進行具體的某一個文件的操作
  
  如果你對於常用的ZIP格式比較熟悉的話JAR文件也就差不多JAR文件提供一種將多個文件打包到一個文件中的方法其中每一個文件可能獨立地被壓縮JAR文件所增加的內容是manifest它允許開發者可以提供附加的關於內容的信息例如manifest表明JAR文件中的哪個文件是用來運行一個程序的或者庫的版本號等
  
  JSEDK提供了一個jar工具你可以用它從控制台讀寫JAR文件然而如果你需要在程序中代碼讀寫JAR文件可能需要一點時間(本文只包含如何在程序中讀寫JAR文件)好消息是你可以做到這一點而且你不用擔心解壓的事因為類庫將幫助你完成這些你所需要的類文件位於javautiljar包中這裡主要的類是JarFile它是jar文件自身的一個引用較大文件中的每一個單獨的文件是通過一個JarEntry引用的
  
  首先通過把將JAR文件位置傳給構造函數創建一個JarFile的實例位置可能是String或File的形式如下
    JarFile jarFile = new JarFile(thefilejar);
  
  或者
  
    File file = new File(thefilejar);
    JarFile jarFile = new JarFile(file);
  
  
  你可能注意到當文件不在class path中時JarFile類對於從JAR中讀取文件文件是很有用的
  當你想指定目標JAR文件時JarFile類對於從JAR中讀取文件同樣也很有用當然如果JAR文件在class path中從其中讀取文件的方法比較簡單你可以用下面的方法
  
   URL url = ClassLoadergetSystemResource(name);
  或者
  
   InputStream stream =
     ClassLoadergetSystemResourceAsStream(name);
  
  這種技術允許你從在class path中的JAR文件裡讀取文件你不必指定JAR文件名
  
  
  還有其他的構造函數如認證支持標志要刪除的文件等這些構造函數在這兒不做說明
  
  當你有了該JAR文件的一個引用之後你就可以讀取其文件內容中的目錄信息了JarFile的entries方法返回所有entries的枚舉集合(Enumeration)通過每一個entry你可以從它的manifest文件得到它的屬性任何認證信息以及其他任何該entry的信息如它的名字或者大小等
  
   Enumeration enum = jarFileentries();
   while (enumhasMoreElements()) {
    process(enumnextElement());
   }
  
  正如前面提到的每一個entry是一個JarEntry該類有getNamegetSizegetCompressedSize等方法
  
  下面讓我們舉例說明在程序中如何使用這些特性下面的程序顯示你指定的JAR文件中內容的名稱大小壓縮大小等(這有點類似於在使用jar命令時指定tv選項)
  
   import javaio*;
   import javautil*;
   import javautiljar*;
  
   public class JarDir {
    public static void main (String args[])
      throws IOException {
     if (argslength != ) {
      Systemoutprintln(
        Please provide a JAR filename);
      Systemexit();
     }
     JarFile jarFile = new JarFile(args[]);
     Enumeration enum = jarFileentries();
     while (enumhasMoreElements()) {
      process(enumnextElement());
     }
    }
  
    private static void process(Object obj) {
     JarEntry entry = (JarEntry)obj;
     String name = entrygetName();
     long size = entrygetSize();
     long compressedSize = entrygetCompressedSize();
     Systemoutprintln(
       name + \t + size + \t + compressedSize);
    }
   }
  
  如果你用JSE中的jcejar作為參數運行上面的JarDir程序你將看到類似於下面的輸出(部分為省略掉的輸出)
  
  METAINF/MANIFESTMF    
  METAINF/JCEJARSSF    
  METAINF/JCEJARSDSA    
  METAINF/       
  javax/    
  javax/crypto/     
  javax/crypto/interfaces/       
  javax/crypto/interfaces/DHKeyclass     
  javax/crypto/interfaces/DHPublicKeyclass      
  javax/crypto/interfaces/DHPrivateKeyclass     
  javax/crypto/interfaces/PBEKeyclass    
  javax/crypto/SecretKeyclass    
  
  
  注意輸出最開始的METAINF行這是manifest和安全認證信息字節的entries不是文件但是有點相當於目錄
  
  為了從JAR文件中真正讀取一個指定的文件你必須到其entry的InputStream這和JarEntry不一樣這是因為JarEntry只是包含該entry的有關信息但是並不實際包含該entry的內容這和File和FileInputStream的區別有點兒相似訪問文件沒有打開文件它只是從目錄中讀取了該文件的信息下面是如何得到entry的InputStream
  
   InputStream input = jarFilegetInputStream(entry);
  
  當你有了輸入流你就可以像讀取其他流一樣讀取它在文本流中(text stream)記得使用讀取器(Reader)從流中取得字符對於面向字節的流如圖片文件直接讀取就行了
  
  下面的程序演示如何從JAR文件中讀取文件指定JAR文件的名稱要讀取的文件的名稱(打包JAR文件中的某一個文件)作為參數來調用該程序要讀取的文件應該有一個文本類型的
  
   import javaio*;
   import javautiljar*;
  
   public class JarRead {
    public static void main (String args[])
      throws IOException {
     if (argslength != ) {
      Systemoutprintln(
       Please provide a JAR filename and file to read);
      Systemexit();
     }
     JarFile jarFile = new JarFile(args[]);
     JarEntry entry = jarFilegetJarEntry(args[]);
     InputStream input = jarFilegetInputStream(entry);
     process(input);
     jarFileclose();
    }
  
    private static void process(InputStream input)
      throws IOException {
     InputStreamReader isr =
     new InputStreamReader(input);
     BufferedReader reader = new BufferedReader(isr);
     String line;
     while ((line = readerreadLine()) != null) {
      Systemoutprintln(line);
     }
     readerclose();
    }
   }
  
  假設在myfilesjar文件中有一個spidertxt文件spider文件的內容如下
  
   The itsy bitsy spider
   Ran up the water spout
   Down came the rain and
   Washed the spider out
  
  你可以通過下面的命令來顯示該文本文件的內容
  
   java JarRead myfilesjar spidertxt 
  
  有關JAR文件的更多內容請參考JAR文件規范

From:http://tw.wingwit.com/Article/program/Java/hx/201311/26791.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.