<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Open-Source World

    let's learn and study.
    posts - 28, comments - 23, trackbacks - 0, articles - 1
    多數(shù) java 程序員都非常清楚使用 jar 文件將組成 java 解決方案的各種資源(即 .class 文件、聲音和圖像)打包的優(yōu)點(diǎn)。剛開(kāi)始使用 jar 文件的人常問(wèn)的一個(gè)問(wèn)題是:“如何從 jar 文件中提取圖像呢?”本文將回答這個(gè)問(wèn)題,并會(huì)提供一個(gè)類(lèi),這個(gè)類(lèi)使從 jar 文件中提取任何資源變得非常簡(jiǎn)單!

      加載 gif 圖像

      假定我們有一個(gè) jar 文件,其中包含我們的應(yīng)用程序要使用的一組 .gif 圖像。下面就是使用 JarResources 訪問(wèn) jar 文件中的圖像文件的方法:

    JarResources JR=new JarResources("GifBundle.jar");

    Image logo=Toolkit.getDefaultToolkit().createImage(JR.getResources("logo.gif"));

      這段代碼說(shuō)明我們可以創(chuàng)建一個(gè)JarResources對(duì)象,并將其初始化為包含我們要使用的資源的 jar 文件 -- images.jar。隨后我們使用JarResources的getResource()方法將來(lái)自 logo.gif 文件的原始數(shù)據(jù)提供給 awt Toolkit 的createImage()方法。

      命名說(shuō)明

      JarResource 是一個(gè)非常簡(jiǎn)單的示例,它說(shuō)明了如何使用 java 所提供的各種功能來(lái)處理 jar 和 zip 檔案文件。

      工作方式

      JarReources類(lèi)的重要數(shù)據(jù)域用來(lái)跟蹤和存儲(chǔ)指定 jar 文件的內(nèi)容:

    public final class JarResources {
    public boolean debugon=false;
    private Hashtable htsizes=new Hashtable();
    private Hashtable htjarcontents=new Hashtable();
    private String jarfilename;

      這樣,該類(lèi)的實(shí)例化設(shè)置 jar 文件的名稱(chēng),然后轉(zhuǎn)到init()方法完成全部實(shí)際工作。

    public JarResources(String jarfilename) {
    this.jarfilename=jarfilename;
    init();
    }

      現(xiàn)在,init()方法只將指定 jar 文件的整個(gè)內(nèi)容加載到一個(gè) hashtable(通過(guò)資源名訪問(wèn))中。

      這是一個(gè)相當(dāng)有用的方法,下面我們對(duì)它作進(jìn)一步的分析。ZipFile類(lèi)為我們提供了對(duì) jar/zip 檔案頭信息的基本訪問(wèn)方法。這類(lèi)似于文件系統(tǒng)中的目錄信息。下面我們列出ZipFile中的所有條目,并用檔案中每個(gè)資源的大小添充 htsizes hashtable:

    private void init() {
    try {
    // extracts just sizes only.
    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();

      接下來(lái),我們使用ZipInputStream類(lèi)訪問(wèn)檔案。ZipInputStream類(lèi)完成了全部魔術(shù),允許我們單獨(dú)讀取檔案中的每個(gè)資源。我們從檔案中讀取組成每個(gè)資源的精確字節(jié)數(shù),并將其存儲(chǔ)在 htjarcontents hashtable 中,您可以通過(guò)資源名訪問(wèn)這些數(shù)據(jù):

    // extract resources and put them into the hashtable.
    FileInputStream fis=new FileInputStream(jarFileName);
    BufferedInputStream bis=new BufferedInputStream(fis);
    ZipInputStream zis=new ZipInputStream(bis);
    ZipEntry ze=null;
    while ((ze=zis.getNextEntry())!=null) {
    if (ze.isDirectory()) {
    continue; ////啊喲!沒(méi)有處理子目錄中的資源啊
    }
    if (debugOn) {
    System.out.println(
    "ze.getName()="+ze.getName()+","+"getSize()="+ze.getSize()
    );
    }
    int size=(int)ze.getSize();
    // -1 means unknown size.
    if (size==-1) {
    size=((Integer)htSizes.get(ze.getName())).intValue();
    }
    byte[] b=new byte[(int)size];
    int rb=0;
    int chunk=0;
    while (((int)size - rb) > 0) {
    chunk=zis.read(b,rb,(int)size - rb);
    if (chunk==-1) {
    break;
    }
    rb+=chunk;
    }
    // add to internal resource hashtable
    htJarContents.put(ze.getName(),b);
    if (debugOn) {
    System.out.println(
    ze.getName()+" rb="+rb+
    ",size="+size+
    ",csize="+ze.getCompressedSize()
    );
    }
    }
    } catch (NullPointerException e) {
    System.out.println("done.");
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

      請(qǐng)注意,用來(lái)標(biāo)識(shí)每個(gè)資源的名稱(chēng)是檔案中資源的限定路徑名,例如,不是包中的類(lèi)名 -- 即 java.util.zip 包中的ZipEntry類(lèi)將被命名為 "java/util/zip/ZipEntry",而不是 "java.util.zip.ZipEntry"。

    其它方法:

    /**
    * Dumps a zip entry into a string.
    * @param ze a ZipEntry
    */
    private String dumpZipEntry(ZipEntry ze) {
    StringBuffer sb=new StringBuffer();
    if (ze.isDirectory()) {
    sb.append("d ");
    } else {
    sb.append("f ");
    }
    if (ze.getMethod()==ZipEntry.STORED) {
    sb.append("stored ");
    } else {
    sb.append("defalted ");
    }
    sb.append(ze.getName());
    sb.append("\t");
    sb.append(""+ze.getSize());
    if (ze.getMethod()==ZipEntry.DEFLATED) {
    sb.append("/"+ze.getCompressedSize());
    }
    return (sb.toString());
    }
    /**
    * Extracts a jar resource as a blob.
    * @param name a resource name.
    */
    public byte[] getResource(String name) {
    return (byte[])htJarContents.get(name);
    }

      代碼的最后一個(gè)重要部分是簡(jiǎn)單的測(cè)試驅(qū)動(dòng)程序。該測(cè)試驅(qū)動(dòng)程序是一個(gè)簡(jiǎn)單的應(yīng)用程序,它接收 jar/zip 檔案名和資源名。它試圖發(fā)現(xiàn)檔案中的資源文件,然后將成功或失敗的消息報(bào)告出來(lái):

    public static void main(String[] args) throws IOException {
    if (args.length!=2) {
    System.err.println(
    "usage: java JarResources < jar file name> < resource name>"
    );
    System.exit(1);
    }
    JarResources jr=new JarResources(args[0]);
    byte[] buff=jr.getResource(args[1]);
    if (buff==null) {
    System.out.println("Could not find "+args[1]+".");
    } else {
    System.out.println("Found "+args[1]+ " (length="+buff.length+").");
    }
    }
    } // End of JarResources class.

      您已了解了這個(gè)類(lèi)。一個(gè)易于使用的類(lèi),它隱藏了使用打包在 jar 文件中的資源的全部棘手問(wèn)題。

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 黄色a级片免费看| 午夜成人无码福利免费视频| 亚洲国产午夜精品理论片| 国产精品亚洲四区在线观看 | 免费毛片在线看片免费丝瓜视频| 妞干网免费视频在线观看| 亚洲人成中文字幕在线观看| 亚洲黄页网在线观看| 人妻免费一区二区三区最新| 免费观看的av毛片的网站| 国产av天堂亚洲国产av天堂| 亚洲av无码专区青青草原| 2019中文字幕在线电影免费 | 香港一级毛片免费看| 四虎永久在线免费观看| 久久亚洲精品无码aⅴ大香| 一级毛片在线播放免费| 在线a毛片免费视频观看| 亚洲成AV人片在WWW| 国产成人精品免费视频动漫| 中文字幕在亚洲第一在线| 亚洲风情亚Aⅴ在线发布| 国产一卡二卡≡卡四卡免费乱码| 日日摸夜夜添夜夜免费视频| 亚洲一区二区三区在线观看精品中文| 免费看搞黄视频网站| 亚洲午夜久久久久久噜噜噜| 一级毛片免费观看| 久久久亚洲精品视频| 国产又黄又爽胸又大免费视频| 免费va人成视频网站全| 亚洲精品理论电影在线观看| 四虎永久免费影院| 免费91麻豆精品国产自产在线观看 | 无码日韩精品一区二区免费| 亚洲精品国产免费| 曰批全过程免费视频播放网站| 亚洲一区二区三区高清不卡| 亚洲日本中文字幕天堂网| 视频一区在线免费观看| 久久久久亚洲Av片无码v|