java读取jar包中的资源文件

 一般我们在编写完Java程序中获取资源路径,在开发和调试期(未打包前),是没有问题的,但在打包后,由于资源(图片、配置文件等)都将打包到jar文件中,由于System中的“user.dir”属性发生了变化,会造成用绝对路径的方式无法找到jar文件中的资源文件。因为程序载入图片或文本文件时,使用以当前工作路径为基准的方式来指定文件和路径,而资源文件打在jar包中后程序无法通过绝对路径找到。因此可采用Java本身以类为基准的路径搜索方式。如下两种方式:

取得相对于包的根路径

Java Code 复制内容到剪贴板
  1. String path = new File(FrameConfig.class.getResource("/").getFile())  
  2.         .getAbsolutePath();  

 

取得相对于包路径的流

Java Code 复制内容到剪贴板
  1. Reader reader = new InputStreamReader(  
  2.         FrameConfig.class.getResourceAsStream("/res/uiConfig.xml"));  

 

 

含有这种代码的程序在运行时,以类(类路径)为基准,而不依赖当前路径(System中的user.dir),

【注】:上面的路径“/res/uiConfig.xml”是相对于包的路径,如果写成“res/uiConfig.xml”,表示相对于类的路径:package/res/uiConfig.xml,这需要将图片和文本等文件的保存路径,和程序中指定的路径两者保持一致。

读取jar包中根Element(dom4j)

Java Code 复制内容到剪贴板
  1. private static Element getRootElement(String path) {  
  2.     Element rootElement = null;  
  3.     Reader reader = null;  
  4.     try {  
  5.         reader = new InputStreamReader(  
  6.                 FrameConfig.class.getResourceAsStream(path));  
  7.         rootElement = new SAXReader().read(reader).getRootElement();  
  8.     } catch (Exception e) {  
  9.         e.printStackTrace();  
  10.     } finally {  
  11.         closeStream(reader);  
  12.     }  
  13.     return rootElement;  
  14. }  
  15.   
  16. private static void closeStream(Closeable stream) {  
  17.     if (stream != null)  
  18.         try {  
  19.             stream.close();  
  20.         } catch (IOException e) {  
  21.             e.printStackTrace();  
  22.         }  
  23. }  
  24.   
  25. public static void main(String[] args) {  
  26.     Element uiConfig = getRootElement("/res/uiConfig.xml");  
  27. }  

 

 

 

读取jar包中根Element(jdom)

Java Code 复制内容到剪贴板
  1. private static Element getRootElement(String path) {  
  2.     Element rootElement = null;  
  3.     Reader reader = null;  
  4.     try {  
  5.         reader = new InputStreamReader(  
  6.                 FrameConfig.class.getResourceAsStream(path));  
  7.         rootElement = new SAXBuilder().build(reader).getRootElement();  
  8.     } catch (Exception e) {  
  9.         e.printStackTrace();  
  10.     } finally {  
  11.         closeStream(reader);  
  12.     }  
  13.     return rootElement;  
  14. }  

 

读取jar包中国际化资源文件

Java Code 复制内容到剪贴板
  1. ResourceBundle resources = ResourceBundle.getBundle(  
  2.         "res.i18n", Locale.getDefault());  
  3. // 取得对应的值  
  4. String value = resources.getString(key);  

 

读取jar包中的图片资源

Java Code 复制内容到剪贴板
  1. public static Image getImage(String imageName) {  
  2.     InputStream inputStream = null;  
  3.     ByteArrayOutputStream outputStream = null;  
  4.     try {  
  5.         inputStream = FrameConfig.class.getResourceAsStream("/res/images/"  
  6.                 + imageName);  
  7.         outputStream = new ByteArrayOutputStream();  
  8.         byte buffer[] = new byte[1024];  
  9.         int len = 0;  
  10.         while ((len = inputStream.read(buffer)) != -1)  
  11.             outputStream.write(buffer, 0, len);  
  12.         return Toolkit.getDefaultToolkit().createImage(  
  13.                 outputStream.toByteArray());  
  14.     } catch (Throwable th) {  
  15.         th.printStackTrace();  
  16.     } finally {  
  17.         closeStream(inputStream);  
  18.         closeStream(outputStream);  
  19.     }  
  20.     return null;  
  21. }  
  22.   
  23. public static void main(String[] args) {  
  24.     Image image = getImage("add.gif");  
  25. }  

 

 


本文出自思考者日记网,转载请保留此出处!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值