使用情景

在项目中需要读取springboot的resources下某一个文件夹内为所有文件内容,思路是:先是想读取到文件夹,然后使用file.listFiles()的方式获取文件列表,最后解析文件(可能还有其他方式,但是某些原因,这里只能这样解析文件)eclipse编码的时候,启动时,可以读取到文件,但是打包后变成jar包,就读取不到文件了。尝试了很多种方式,网上最多的是使用classpath:xxx.xml模式读取,但是springboot打包成jar后,tomcat无法读取到jar内部东西,所以尝试了很多种方式,最后使用以流的方式去读取文件,直接读取成功。这次只是简单记录下,方便以后查询和大家参考,也许网上的其他方式也是可行,大家可以自己试一试。

话不多说,直接上个报错信息图

Java无法访问AuditRsItemBaseinfo java无法访问jar包里的类_eclipse

排除尝试过的方法

Resource[] resources = new PathMatchingResourcePatternResolver().
getResources(ResourceUtils.CLASSPATH_URL_PREFIX + conf+"/**/*.xml");

但是java -jar运行后无法读取classpath,可能是因为classpath返回的路径是绝对路径,无法读取jar包内部内容
后来想到既然读取不到,要不尝试去掉ResourceUtils.CLASSPATH_URL_PREFIX试试看,结果尝试成功了

如果是使用File file=new File(“xxx”),这种方式不是以流的方式读取,打包后运行也是无法读取到文件

// 读取文件
File file = ResourceUtils.getFile("classpath:xx.xml");
// 读取文件夹内文件
File file = ResourceUtils.getFile("classpath:/conf");
// 获取文件夹文件绝对路径
File[] tempList = file.listFiles();

这种方式eclipse中启动运行可以读取到,但是java -jar 无法读取,可能是因为classpath返回的路径是绝对路径,无法读取jar包内部内容

读取单个文件,使用下面这种方式 ,代码没报错,但是没有测试是否已经读取到文件

ClassPathResource resources = new ClassPathResource("conf/**/*.xml");

这种方式读取文件夹,后再读取文件,测试过,行不通

ClassPathResource resourcessss = new ClassPathResource("conf");
File file=resourcessss.getFile();

流的方式读取文件(测试有效)

Resource[] resources = new PathMatchingResourcePatternResolver().getResources("conf/**/*.xml");
for (Resource resource : resources) {
	InputStream is = resource.getInputStream();
	String res=conf+resource.getFilename();
	log.info("resource.getFilename():"+resource.getFilename());
	// 剩下的写业务逻辑处理
}

哈哈,今天先记录到这里,以后有空再继续完善下

如果以上方式有问题,可以及时留言,以免误导他人,谢谢!