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

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

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

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
    可能有不少初學(xué)者會(huì)有這樣的困惑(以前我也有過):在你的代碼里調(diào)用了一些資源文件,如圖片,音樂等,在調(diào)試環(huán)境或單獨(dú)運(yùn)行的時(shí)候可以正常顯示或播放,而一旦打包到j(luò)ar文件中,這些東東就再也出不來了,除非把這個(gè)jar放到原來未打包以前的目錄下,但通常jar是單獨(dú)發(fā)布的。這里介紹一個(gè)解決這類問題的方法。
    getResource和getResourceAsStream
        問題的根源還是在于老生常談的所謂class path,不信的話你在系統(tǒng)環(huán)境變量里的ClassPath加上你的jar文件,這下你就看得到你的圖片了!但單獨(dú)發(fā)布jar的話不可能指望每次都讓用戶為你的jar而專門修改classpath。那么有沒有什么辦法一勞永逸地搞定它呢?我們需要從類的裝載入手。先扯遠(yuǎn)一點(diǎn),在開發(fā)JSP之類的Web應(yīng)用程序的時(shí)候要用到第三方的庫怎么辦?通常的做法是把這些庫(可以是class,也可以是jar)統(tǒng)統(tǒng)放到WEB-INF/lib/目錄下面,為什么這樣系統(tǒng)就認(rèn)了呢?因?yàn)閃eb容器(譬如Tomcat)在裝載類的時(shí)候有自己的組織方式(可以參考Tomcat手冊(cè)http://jakarta.apache.org/tomcat/tomcat-4.1-doc/class-loader-howto.html)。特別地,jar也是類裝載器的一個(gè)可訪問媒介,ClassLoader提供了兩個(gè)方法用于從裝載的類路徑中取得資源:
    public URL getResource(String name);
    public InputStream getResourceAsStream(String name);
    這里name是資源的類路徑,它是相對(duì)與“/”根路徑下的位置。getResource得到的是一個(gè)URL對(duì)象來定位資源,而getResourceAsStream取得該資源輸入流的引用保證程序可以從正確的位置抽取數(shù)據(jù)。
    真正使用的不是ClassLoader的這兩個(gè)方法,而是Class的getResource和getResourceAsStream方法,因?yàn)镃lass對(duì)象可以從你的類得到(如YourClass.class或YourClass.getClass()),而ClassLoader則需要再調(diào)用一次YourClass.getClassLoader()方法,但根據(jù)JDK文檔的說法,Class對(duì)象的這兩個(gè)方法其實(shí)是“委托”(delegate)給裝載它的ClassLoader來做的,所以只需要使用Class對(duì)象的這兩個(gè)方法就可以了。
    在參考資料中有一篇老外寫的文章比較深入介紹了從jar中裝載資源的方法。

        一個(gè)應(yīng)用的例子

    以下是在我寫的一個(gè)小工具M(jìn)SNHistoryCombiner中用到的一段代碼,可以從jar中裝載圖片和文本信息。譬如,你的jar中根目錄下有個(gè)img目錄,里面放有一些圖片,如img1.jpg,你可以這樣調(diào)用
    Utilities.getImageFromJar("/img/img1.jpg", YourClass.class);
    注意必須這里是“/img/img1.jpg”而非“img/img1.jpg”。從jar中讀文本資源也是類似方法調(diào)用getTextFromJar。
    需要說明的是,這段代碼也不是我原創(chuàng)的,是從一段別的代碼中經(jīng)過修改得到的,但原代碼的來源忘記了,在這里向原作者表示感謝和歉意。

    import java.awt.Image;
    import java.awt.Toolkit;
    import java.io.*;

    public class ResourseReader {

    public ResourseReader() {
    }

    public static Image getImageFromJar(String s, Class class1) {
    Image image = null;
    InputStream inputstream = class1.getResourceAsStream(s);
    if(inputstream != null) {
    ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();
    try {
    byte abyte0[] = new byte[1024];
    for(int i = 0; (i = inputstream.read(abyte0)) >= 0;) {
    bytearrayoutputstream.write(abyte0, 0, i);
    }

    image = Toolkit.getDefaultToolkit().createImage(bytearrayoutputstream.toByteArray());
    }
    catch(IOException ioexception) {
    ioexception.printStackTrace();
    }
    }
    return image;
    }

    public static String getTextFromJar(String s, Class class1) {
    String s1 = "";
    InputStream inputstream = class1.getResourceAsStream(s);
    if(inputstream != null) {
    BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(inputstream));
    String s2;
    try {
    while((s2 = bufferedreader.readLine()) != null) {
    s1 = s1 + s2 + "\n";
    }
    }
    catch(IOException ioexception) {
    ioexception.printStackTrace();
    }
    }
    return s1;
    }
    }


    從Jar中讀取gif文件


    在Java的程序發(fā)布中,很多人會(huì)選擇采用二進(jìn)制的jar的格式進(jìn)行發(fā)布,怎么樣讀取Jar里面的資源呢?
    主要是采用ClassLoader的下面幾個(gè)方法來實(shí)現(xiàn):
    public URL getResource(String name);
    public InputStream getResourceAsStream(String name)

    public static InputStream getSystemResourceAsStream(String name)
    public static URL getSystemResource(String name)

    后兩個(gè)方法可以看出是靜態(tài)的方法,這幾個(gè)方法都可以從Jar中讀取圖片資源,但是對(duì)與動(dòng)畫的gif文件,筆者在嘗試過程中發(fā)現(xiàn),存在一些差異。

    String gifName為Gif文件在Jar中的相對(duì)路徑。
    (1)使用了兩個(gè)靜態(tài)方法
    BufferedImage image=ImageIO.read(ClassLoader.getSystemResourceAsStream(gifName));

    或者

    Image image=Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource(gifName));

    這兩種方式可以成功地讀取gif文件,但是對(duì)于gif動(dòng)畫,顯示出來地是靜態(tài)的。

    (2)使用其他兩個(gè)方法
    Image image=Toolkit.getDefaultToolkit().getImage(this.getClass.getClassLoader().getResource(gifName));

    再這種方式下動(dòng)畫可以正常顯示了。
    posted on 2007-12-19 18:08 蘆葦 閱讀(827) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA
    主站蜘蛛池模板: 免费中文字幕视频| 亚洲成av人片一区二区三区| 亚洲中文字幕成人在线| 亚洲国产精品ⅴa在线观看| 久久电影网午夜鲁丝片免费| 77777亚洲午夜久久多喷| 免费国产作爱视频网站| 亚洲丰满熟女一区二区v| 福利免费观看午夜体检区| 亚洲一区二区久久| 99久久免费精品国产72精品九九| 亚洲日本VA中文字幕久久道具| 成人免费在线观看网站| 亚洲av成人一区二区三区观看在线| 国产精品成人无码免费| 日本视频免费观看| 亚洲精品高清无码视频| 日本不卡免费新一区二区三区| 亚洲日产2021三区| 在线观看免费污视频| 鲁啊鲁在线视频免费播放| 国产亚洲美女精品久久久| 热99RE久久精品这里都是精品免费| 亚洲精选在线观看| 最近2019中文字幕mv免费看| 猫咪免费观看人成网站在线| 国产亚洲精品不卡在线| 99精品视频免费观看| 亚洲精品456人成在线| 免费va人成视频网站全| 免费精品一区二区三区第35| 激情综合亚洲色婷婷五月APP| 国产乱色精品成人免费视频| 日本一区午夜艳熟免费| 久久精品国产99国产精品亚洲| 国产女高清在线看免费观看| 午夜免费福利片观看| 色欲aⅴ亚洲情无码AV蜜桃 | 成年男女男精品免费视频网站 | a毛片免费在线观看| 亚洲精品白色在线发布|