java 讀取jar包中的資源檔執行個體程式

來源:互聯網
上載者:User

1) ClassLoader是abstract的,不可能執行個體化對象,更加不可能通過ClassLoader調用上面兩個方法。所以我們真正寫代碼的時候,是通過Class類中的getResource()和getResourceAsStream()方法,這兩個方法會委託ClassLoader中的getResource()和getResourceAsStream()方法 。好了,現在我們重新寫一段Resource代碼,來看看上面那段費解的話是什麼意思了:

Java代碼

 代碼如下 複製代碼

package edu.hxraid; 
   import java.io.*; 
    import java.net.URL; 
    public class Resource { 
       public  void getResource() throws IOException{   
              //尋找指定資源的URL,其中res.txt仍然開始的bin目錄下  
         URL fileURL=this.getClass().getResource("/resource/res.txt");  
          System.out.println(fileURL.getFile()); 
     } 
      public static void main(String[] args) throws IOException { 
         Resource res=new Resource(); 
         res.getResource(); 
    } 
   }

(2) 我們不能用常規操作檔案的方法來讀取ResourceJar.jar中的資源檔res.txt,但可以通過Class類的getResourceAsStream()方法來擷取 ,這種方法是如何讀取jar中的資源檔的,這一點對於我們來說是透明的。我們將Resource.java改寫成:

Java代碼

 代碼如下 複製代碼

package edu.hxraid; 
    import java.io.*; 
   public class Resource { 
     public void getResource() throws IOException{ 
      //返回讀取指定資源的輸入資料流 
          InputStream is=this.getClass().getResourceAsStream("/resource/res.txt");  
        BufferedReader br=new BufferedReader(new InputStreamReader(is)); 
       String s=""; 
         while((s=br.readLine())!=null) 
             System.out.println(s); 
     } 
 }

注意

一般我們在編寫完Java程式中擷取資源路徑,在開發和調試期(未打包前),是沒有問題的,但在打包後,由於資源(圖片、設定檔等)都將打包到jar檔案中,由於System中的“user.dir”屬性發生了變化,會造成用絕對路徑的方式無法找到jar檔案中的資源檔。因為程式載入圖片或文字檔時,使用以當前工作路徑為基準的方式來指定檔案和路徑,而資源檔打在jar包中後程式無法通過絕對路徑找到。因此可採用Java本身以類為基準的路徑搜尋方式。如下兩種方式:

取得相對於包的根路徑

 

 代碼如下 複製代碼

String path = new File(FrameConfig.class.getResource("/").getFile()) 

.getAbsolutePath();

取得相對於包路徑的流

Reader reader = new InputStreamReader( 

FrameConfig.class.getResourceAsStream("/res/uiConfig.xml"));

含有這種代碼的程式在運行時,以類(類路徑)為基準,而不依賴當前路徑(System中的user.dir),

【注】:上面的路徑“/res/uiConfig.xml”是相對於包的路徑,如果寫成“res/uiConfig.xml”,表示相對於類的路徑:package/res/uiConfig.xml,這需要將圖片和文本等檔案的儲存路徑,和程式中指定的路徑兩者保持一致。

【注】:上面的路徑“/res/uiConfig.xml”是相對於包的路徑,如果寫成“res/uiConfig.xml”,表示相對於類的路徑:package/res/uiConfig.xml,這需要將圖片和文本等檔案的儲存路徑,和程式中指定的路徑兩者保持一致。

讀取jar包中根Element(dom4j)

 代碼如下 複製代碼

private static Element getRootElement(String path) {
 Element rootElement = null;
 Reader reader = null;
 try {
  reader = new InputStreamReader(
    FrameConfig.class.getResourceAsStream(path));
  rootElement = new SAXReader().read(reader).getRootElement();
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  closeStream(reader);
 }
 return rootElement;
}

private static void closeStream(Closeable stream) {
 if (stream != null)
  try {
   stream.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
}

public static void main(String[] args) {
 Element uiConfig = getRootElement("/res/uiConfig.xml");
}


讀取jar包中根Element(jdom)

 代碼如下 複製代碼

private static Element getRootElement(String path) {
 Element rootElement = null;
 Reader reader = null;
 try {
  reader = new InputStreamReader(
    FrameConfig.class.getResourceAsStream(path));
  rootElement = new SAXBuilder().build(reader).getRootElement();
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  closeStream(reader);
 }
 return rootElement;
}


讀取jar包中國際化資源檔

 代碼如下 複製代碼

ResourceBundle resources = ResourceBundle.getBundle(
  "res.i18n", Locale.getDefault());
// 取得對應的值
String value = resources.getString(key);


讀取jar包中的圖片資源

 代碼如下 複製代碼

public static Image getImage(String imageName) {
 InputStream inputStream = null;
 ByteArrayOutputStream outputStream = null;
 try {
  inputStream = FrameConfig.class.getResourceAsStream("/res/images/"
    + imageName);
  outputStream = new ByteArrayOutputStream();
  byte buffer[] = new byte[1024];
  int len = 0;
  while ((len = inputStream.read(buffer)) != -1)
   outputStream.write(buffer, 0, len);
  return Toolkit.getDefaultToolkit().createImage(
    outputStream.toByteArray());
 } catch (Throwable th) {
  th.printStackTrace();
 } finally {
  closeStream(inputStream);
  closeStream(outputStream);
 }
 return null;
}

public static void main(String[] args) {
 Image image = getImage("add.gif");
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.