背景
最近同事在写一个解析程序的时候,需要读取一个资源库文件,本地测试无问题,但在服务器运行时候却报错,找不到文件。
异常信息
java.io.FileNotFoundException: class path resource [phone.dat] cannot be resolved to absolute file path because it does not reside in the file system: jar:file://xxxxxx.jar!/BOOT-INF/classes!/phone.dat
原因分析
在开发过程中访问的是resources
文件夹下的文件,访问路径格式为classpath:fileName
,通过IDE运行能正确运行,而在服务器中运行时却报错。
原因
通过IDE编译后是以文件夹形式运行,而不是jar包,所以classpath所指向的地址为对应编译的文件夹,而jar包形式运行的时候,文件系统能访问的也就是jar就结束,无法直接访问jar包内的资源文件.
解决问题
如果需要读取jar包中的资源文件则需要通过以下方式进行访问。
ClassPathResource cpr = new ClassPathResource("static/file.txt");
try {
byte[] bdata = FileCopyUtils.copyToByteArray(cpr.getInputStream());
}
.....
或者
this.getClass().getResourceAsStream(path)
.....
同时支持IDE与JAR包读取
/**
* 入口方法
* @param fileName
* @return
*/
private static String getCriteriaFilePath(String fileName){
String path;
try{
path = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + fileName)
.getAbsoluteFile().getPath();
}catch (FileNotFoundException e) {
path = readFile(fileName);
}
return path;
}
/**
*
* @param fileName
* @return
*/
private static String readFile(String fileName){
String ret;
try{
ret = readJarFile(fileName);
}catch (IOException e)
{
throw new RuntimeException("文件读取异常"+e.getMessage());
}
return ret;
}
/**
* 读取jar包中的资源文件
* @param fileName 文件名
* @return 文件内容
* @throws IOException 读取错误
*/
private static String readJarFile(String fileName) throws IOException{
BufferedReader in = new BufferedReader(
new InputStreamReader(TestUtils.class.getClass().getResourceAsStream(fileName)));
StringBuilder buffer = new StringBuilder();
String line;
while ((line = in.readLine()) != null)
{
buffer.append(line);
}
return buffer.toString();
}