Java 应用读取 jar 包中的文件

文章目录

  • 1、jar 包中的文件是资源
  • 2、使用 ClassLoader 来加载资源
  • 3、使用 Spring Resource 工具

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!!

你可能感兴趣的:(Java)