SpringBoot如何读取classpath下的⽂件
SpringBoot 读取classpath下⽂件
开发过程中,必不可少的需要读取⽂件,对于打包⽅式的不同,还会存在⼀些坑,⽐如以jar包⽅式部署时,⽂件都存在于jar包中,某些读取⽅式在开发⼯程中都可⾏,但是打包后,由于⽂件被保存在jar中,会导致读取失败。
这时就需要通过类加载器读取⽂件,类加载器可以读取jar包中的class类当然也可以读取jar包中的⽂件。
// ⽅法1:获取⽂件或流
// ⽅法2:获取⽂件
File file = org.springframework.File("");
// ⽅法3:获取⽂件或流
ClassPathResource classPathResource = new ClassPathResource("");
classPathResource .getFile();
classPathResource .getInputStream();
// >>>>>>>>>>>>>>>> 下⾯⽅法可以读取jar包下⽂件
假设resources⽬录下有⼀个⽂件,⾸先获得当前的类加载器,通过类加载器读取⽂件。
// ⽅法1
InputStream io = Thread.currentThread().getContextClassLoader().getResourceAsStream("");
// ⽅法2
InputStream io = getClass().getClassLoader().getResourceAsStream("");
注意:
Spring⼯具类会对classpath路径做处理,类加载器不会对classpath做处理,因此使⽤类加载器读取⽂件,路径中不要添加classpath
SpringBoot项⽬打包成jar后获取classpath下⽂件失败
公司的⼀个SpringBoot项⽬中,有需要下载⽂件模板的需求,按理来说分布式项⽬⽂件都应该上传到⽂件服务器,但是由于⽂件不是太多于是就放在了classpath下,在本地开发的时候发现都能正常下载⽂件,但是打包成jar上传到Linxu测试环境上就报错,不到classpath路径。
原因
原因是项⽬打包后Spring试图访问⽂件系统路径,但⽆法访问JAR包中的路径。我们使⽤File("classpath:");这样的⽅式是获取不到路径的。
解决⽅案
我们虽然不能直接获取⽂件资源路径,但是我们可以通过流的⽅式读取资源,拿到输⼊流过后我们就可以对其做操作了。关键代码如下:ClassPathResource resource = new ClassPathResource("\\static\\pattern\\");    // static/pattern下的 ⽂件
InputStream in = InputStream();  //获取⽂件输⼊流
⽰例Demo
1. 在static下新建pattern⽬录,并新建⼀个名为 的⽂件spring怎么读取jar文件
2. 新建DownloadController.java
代码如下:
ller;
import io.ClassPathResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.URLEncoder;
@RestController
public class DownloadController {
@GetMapping("/download/pattern")
public void downloadPattern(HttpServletRequest request, HttpServletResponse response){        System.out.println("开始下载⽂件.....");
ClassPathResource resource = new ClassPathResource("\\static\\pattern\\");
try {
//获取⽂件输⼊流
InputStream in = InputStream();
//下载⽂件
downFile("test⽂件.txt",request,response,in);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 下载⽂件
* @param fileName 下载⽂件名称
* @param response 响应
* @throws IOException 异常
*/
public static void downFile(String fileName,HttpServletRequest request,
HttpServletResponse response,InputStream in) throws IOException {        //输出流⾃动关闭,java1.7新特性
try(OutputStream os = OutputStream()) {
fileName = de(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
response.setContentType("application/octet-stream; charset=UTF-8");
byte[] b = new byte[in.available()];
os.write(b);
os.flush();
} catch (Exception e) {
System.out.println("fileName=" + fileName);
e.printStackTrace();
} finally {
if (in != null) {
in.close();
}
}
}
}
3. 测试使⽤Maven⼯具把项⽬打成jar包
在target下⽣成了jar包
进⼊jar包所在的⽂件夹,按住shift并右击,点击在此处打开命令⾏窗⼝。输⼊命令启动项⽬ java -jar 打包后的⽂件
此时我们可以卡看到⽂件下载成功
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。