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"); } |