Java 应用读取 jar 包中的文件

1、jar 包中的文件是资源

jar 包是一个单独的文件而非文件夹,绝对不可能通过 “file:/e:/…/classes/application.properties” 这种形式的文件 URL 来定位 application.properties。即使是相对路径,也无法定位到 jar 文件内的 application.properties 文件。

File file=new File(this.getClass()
			.getClassLoader()
			.getResource("application.properties")
			.getPath());
BufferedReader br=new BufferedReader(new FileReader(file));

上面的代码可以正确的获取文件系统中的文件,但是无法获取 jar 中的文件,也就是说调试时是没问题的,但是运行 jar 时,会失败。

2、使用 ClassLoader 来加载资源

对于 java 应用来说,所有的 .class 文件都在 jar 中,既然 ClassLoader 能正确的加载 .class 文件,那么肯定也可以加载 jar 中的其他文件。

但是这里有一点要特别注意,对于 jar 中的文件,已经不能再视其为 File 了,所以一切跟 File 相关的方法统统不再有效,对于 ClassLoader 来说,jar 中的一切都是资源,是 Resource

只能使用 Resource 相关的方法,来加载 Jar 中的 “文件”:

BufferedReader in = new BufferedReader(new InputStreamReader(this.getClass()
			.getClassLoader()
			.getResourceAsStream("application.properties")));

使用以上代码,可以正确加载 Jar 中的 application.properties 文件。

3、使用 Spring Resource 工具

也可以使用 Spring 提供的工具,例如 PathMatchingResourcePatternResolver:

Resource[] resources = new PathMatchingResourcePatternResolver()
							.getResources("classpath:/db/*.sql")
							
BufferedReader in = new BufferedReader(new InputStreamReader(resources[0].getInputStream()));

千万要注意,Spring 的 Resource 接口,既提供了 getInputStream() 方法,又提供了 getFile() 方法,如果这里使用了 getFile() 方法,将无法从 jar 中读取文件!!!!

因为 jar 中的资源不是 File!!

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值