如何读取JAR包中的资源文件(如XML、TXT等)

如何读取 JAR 包中的资源文件(如 XML TXT 等)?

getResource getResourceAsStream

  问题的根源还是在于老生常谈的所谓 class path ,不信的话你在系统环境变量里的 ClassPath 加上你的 jar 文件,这下你就看得到你的图片了!但单独发布 jar 的话不可能指望每次都让用户为你的 jar 而专门修改 classpath 。那么有没有什么办法一劳永逸地搞定它呢?我们需要从类的装载入手。先扯远一点,在开发 JSP 之类的 Web 应用程序的时候要用到第三方的库怎么办?通常的做法是把这些库(可以是 class ,也可以是 jar )统统放到 WEB-INF/lib/ 目录下面,为什么这样系统就认了呢?因为 Web 容器(譬如 Tomcat )在装载类的时候有自己的组织方式(可以参考 Tomcat 手册 http://jakarta.apache.org/tomcat/tomcat-4.1-doc/class-loader-howto.html )。特别地, jar 也是类装载器的一个可访问媒介, ClassLoader 提供了两个方法用于从装载的类路径中取得资源:


  
public URL getResource(String name);

  
public InputStream getResourceAsStream(String name);

  这里 name 是资源的类路径,它是相对与 “/” 根路径下的位置。 getResource 得到的是一个 URL 对象来定位资源,而 getResourceAsStream 取得该资源输入流的引用保证程序可以从正确的位置抽取数据。


  真正使用的不是 ClassLoader 的这两个方法,而是 Class getResource getResourceAsStream 方法,因为 Class 对象可以从你的类得到(如 YourClass.class YourClass.getClass() ),而 ClassLoader 则需要再调用一次 YourClass.getClassLoader() 方法,但根据 JDK 文档的说法, Class 对象的这两个方法其实是 委托 delegate )给装载它的 ClassLoader 来做的,所以只需要使用 Class 对象的这两个方法就可以了。

 

下面是我的解决办法:

InputStream file = this.getClass().getResourceAsStream("/1d.txt");

this 是当前类实例,通过当前类实例来获取, "/1d.txt" 为相对与当前的 classes 文件夹 ,文件夹结构图:

代码如下:

public void readFromJar() throws IOException{

              InputStream file = this .getClass().getResourceAsStream( "/1d.txt" ); // 可以正常使用

      

//     InputStream file = RReader.class.getResourceAsStream("/reader/3d.txt");// 错误

//     InputStream file = this.getClass().getResourceAsStream("3d.txt");// 如果使用相对路径,则需要资源文件和 class 文件的相对位置容易确定

       int temp = 0;

       while ((temp = file.read()) != -1){

                  content +=( char )temp;

       }

       file.close();

       System . out .println(content);

    }

 

深入jar包:从jar包中读取资源文件

http://www.javaeye.com/topic/483115?page=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值