描述:
在开发过程中常常会遇到业务需要对合同模板进行修改的场景,如果遇见一个不会改变的合同模板的话可以放到jar包,并且设置为一个软引用缓存,会提高一部分读取文件的速度。
代码如下:
// pdf文件字节流的软引用
private static SoftReference<byte[]> softPdf;
/**
* @param response http响应信息
* @return 获取pdf文件
*/
@RequestMapping(value = "/testPdf", method = RequestMethod.GET)
public ResponseEntity testPdf(HttpServletResponse response) {
response.setContentType(MediaType.APPLICATION_OCTET_STREAM.toString());
response.setHeader("Content-Disposition", "attchement;filename=" + "aaa.pdf");
try (ServletOutputStream outputStream = response.getOutputStream()) {
// 默认路径为resource 文件夹下
outputStream.write(getSoftPdfByte("aaa.pdf"));
} catch (IOException e) {
return getErrMsgResponseEntity("文件传输发生异常");
}
return new ResponseEntity(HttpStatus.OK);
}
/**
* @param filePath resources包下的文件路径
* @return 返回文件对应的字节流
* @throws IOException
* 模仿boot获取banner的方式来获取resources下的文件
* 通过文件路径获取对应的字节流
*/
private byte[] getSoftPdfByte(String filePath) throws IOException {
// 1.判断软引用是否被回收了,如果没有回收的话直接返回
if (softPdf != null && softPdf.get() != null) {
// fixme 待测试此处是否会被回收
return softPdf.get();
}
// 2.获取默认类加载器
ClassLoader defaultClassLoader = ClassUtils.getDefaultClassLoader();
DefaultResourceLoader defaultResourceLoader = new DefaultResourceLoader(defaultClassLoader);
// 3.获取resources路径下的 aaa.pdf 文件
org.springframework.core.io.Resource resource = defaultResourceLoader.getResource(filePath);
if (resource.exists()) {
// 4.创建软引用对象
byte[] pdfBytes = IoUtil.read(resource.getInputStream());
softPdf = new SoftReference<>(pdfBytes);
// 5.防止在创建软引用后发生了回收,所以不返回 softPdf.get(),直接返回byte[] 对象
return pdfBytes;
} else {
// 6.测试代码
return null;
}
}
/**
* @param errMsg 错误信息
* @return 通用错误返回信息
*/
private ResponseEntity<byte[]> getErrMsgResponseEntity(String errMsg) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("errorMsg", errMsg);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpStatus statusCode = HttpStatus.OK;
return new ResponseEntity(jsonObject, headers, statusCode);
}