1、问题描述
最近我碰到了一个问题,我打了jar包以后无法通过文件路径访问resources目录下的文件。
2、产生原因
因为通过package打的jar包本身就是一个压缩文件,压缩以后的话,resources目录下的文件的路径就会发生变化了,而且对于压缩文件除非使用专门的解压缩软件,否则你也打不开这个包啊!因此就会造成路径不对无法访问jar包中编译后resources目录下的文件。
3、解决方法
其实很简单,访问resources目录下的文件你就以流的形式去访问。如果想要新建文件,直接在服务器上的某个目录下新建,不要把路径写在resources目录下!
4、我的代码
引入common IO用于对文件流的操作
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.13.0</version>
</dependency>
//获取resources目录下的文件
@Value("classpath:/logo.png")
private Resource logoResource;
@Value("classpath:/STSONG.TTF")
private Resource stsongResource;
public File createPDF() throws java.io.IOException {
//在服务器根目录上新建一个专门的文件夹
File temp = new File("\\ITextPDFandEasyExcelUtil");
String path = "";
if (!temp.exists()) {
temp.mkdir();
path = temp.getPath();
}
File logoFile = new File(temp.getPath() + "/logo.png");
File stsongFile = new File(temp.getPath() + "/STSONG.TTF");
if (!logoFile.exists()) {
FileUtils.copyInputStreamToFile(logoResource.getInputStream(), logoFile);
}
if (!stsongFile.exists()) {
FileUtils.copyInputStreamToFile(stsongResource.getInputStream(), stsongFile);
}
......
}
其实就是先在服务器上的根目录创建一个文件夹再把resources目录下的文件拷贝一份到该文件夹里。
注意获取文件流,最好用@Value取文件并赋值给Resource,因为如果用File file=new File(xxx)在打成jar包的时候,是会找不到文件的。jar中操作文件一定要以流的形式操作!
5、总结
其实这是一个很基本的java常识,java中的jar包是压缩包,打包以后原工程项目中的文件路径会发生变化,不能再用工程绝对路径了,一定要用相对路径!也不能用new File(),一定要用流!如果一定要用new File()的话,建议在jar包外新建一个文件夹用于File操作!