如何读取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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个非常流行的Java框架,它可以轻松地将Java应用部署为独立的、自包含的可执行jar文件,包含了应用所有所需的依赖库。但是,有时候我们需要从可执行jar文件读取一些配置文件或者源文件,这些文件在构建过程被打包进了jar包文件。那么该怎么读取这些文件呢? Spring Boot提供了一个非常简单的方式,只需要使用Spring框架的Resource类就可以轻松地实现。在Spring Boot使用Resource类来读取jar包文件,如下所示: ```java import org.springframework.core.io.Resource; import org.springframework.core.io.ClassPathResource; public class ReadFileFromJar { public static void main(String[] args) throws IOException { Resource resource = new ClassPathResource("config.properties"); InputStream inputStream = resource.getInputStream(); Properties properties = new Properties(); properties.load(inputStream); String value = properties.getProperty("key"); System.out.println(value); } } ``` 上面的代码,我们首先使用ClassPathResource类创建一个Resource对象,然后调用getInputStream()方法获取文件的输入流。最后,我们使用Properties类读取属性文件的内容,并输出其的一个属性值。 注意:在使用Spring Boot的时候,所有的源文件都需要放到classpath路径下,这样Resource类才能正确读取。在IDE集成开发环境,可以将这些文件放到src/main/resources目录下,或者配置maven的build过程将这些源文件打包到jar文件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值