如何读取 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 文件夹 ,文件夹结构图:

jar包读取resource下文件 读取jar包中的xml文件_jar

代码如下:

public   void  readFromJar()  throws  IOException{
               this .getClass().getResourceAsStream( "/1d.txt" ); // 可以正常使用
       
//      错误
//      如果使用相对路径,则需要资源文件和 class 文件的相对位置容易确定
        int  temp = 0;
        while ((temp = file.read()) != -1){
                   char )temp;
       
       
        System out .println(content);