读取jar包中resource文件夹下的文件

 前两天写了对医院端提供的接口,接口需要从数据库中主动抽取符合条件的数据,然后将数据替换到resource文件夹下已有的XML模板中,例如模板在resource文件夹的templete文件夹中,模板名称为publicTemplete.xml,刚开始使用了File file = ResourceUtils.getFile("classpath:templates/publicTemplete.xml"),然后将获取到的xml模板通过SAXReader解析成Document文件,在通过Document的asXML方法转换成字符串返回给调用者,代码如下:

private String returnXmlStr() throws FileNotFoundException, UnsupportedEncodingException, IOException {
	File file = ResourceUtils.getFile("classpath:templates/publicTemplete.xml");
	SAXReader reader = new SAXReader();
	Document doc = reader.read(file);		
	return doc.asXML();
}

 上述代码在未发布成Jar包前通过eclipse启动springboot项目,是可以使用的,然而等到发布成Jar包后通过java -jar xxx.jar来启动时,控制台就会报异常:class path resource [templates/publicTemplete.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/ydhl/xxx。通过百度发现从Jar包中读取文件需要使用ClassPathResource类的getInputStream()方法来完成,代码如下:

private String returnXmlStr() throws FileNotFoundException, UnsupportedEncodingException, IOException {
        //此处如果用File file = Resource.getFile(filePath)会报异常:找不到文件
	    Resource resource = new ClassPathResource("classpath:templates/publicTemplete.xml");
	    InputStream is = resource.getInputStream();
	    ByteArrayOutputStream result = new ByteArrayOutputStream();
	    byte[] buffer = new byte[1024];
	    int length;
	    while ((length = is.read(buffer)) != -1) {
	    	result.write(buffer, 0, length);
	    }
	    return result.toString(StandardCharsets.UTF_8.name());
	}

再次通过java -jar xxx.jar启动Jar包,读取成功,特此记录下来,已备查寻和增加印象。

你可能感兴趣的:(Java)