可能大家在开发过程中都会遇到读取静态文件的操作,用于在程序启动过程中的配置加载,那如何去读取,如何去实现这个问题,代码如何编写呢?
实现
JAVA
的静态文件我们一般都是放在 src/main/resources
目录下面:
例如这次所遇到的问题如下图 ↓
因为我需要在工具 jar
包中读取这两个 xml
文件,来实现对系统配置的加载。然后就遇到问题了。
问题
在使用如下代码时:
Resource resource = new ClassPathResource("xxx.xml");
File file = resource.getFile();
在本地调试时完全没有问题,然后就认为代码完美。然而当程序 JAR
包部署到linux环境上时出现了错误:
class path resource [xxxx] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:xxxx.jar!/BOOT-INF/classes!xxxx
出于好奇心得驱动断点进去看resource.getFile()
到底是什么,截图断点如下:
进入断点发现:这个竟然是jar
查看报错的信息,找到这个类的这个方法org.springframework.util.ResourceUtils#getFile()
,啊哈,原来如此:
当获取的文件协议不是
file
的时候会抛出异常:
throw new FileNotFoundException(description + " cannot be resolved to absolute file path because it does not reside in the file system: " + resourceUrl);
这样这个问题就知道原因了。
解决
ResouceUtils.getFile()是专门用来加载非压缩和Jar包文件类型的资源,所以它根本不会去尝试加载Jar中的文件,要想加载Jar中的文件,只要用可以读取jar中文件的方式加载就可以了。
String txt = "";
Resource resource = new ClassPathResource("/xxx.xml");
BufferedReader JarUrlProcReader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
StringBuilder buffer = new StringBuilder();
String JarUrlProcStr;
while((JarUrlProcStr = JarUrlProcReader.readLine()) != null) {
buffer.append(JarUrlProcStr);
log.info("producerUrl" + JarUrlProcStr);
}
txt = buffer.toString();
然后根据需要去处理你的字符串数据就可以了。
因为我用的是XML文件格式所以我使用:
Document doc = DocumentHelper.parseText(txt);
Element root = doc.getRootElement();
List<Element> elementList = root.elements();
String rootName = root.getName();