Java读取文件响应后文件一直被占用问题

原因:

  由于是封装的函数,请求和响应对象都是 形参地址

  虽然在此函数里关闭了输出流,但是由于有返回值,调用未结束,输出流无法提前关闭

解决:

  1:调用函数后,在外部函数再次关闭响应流

  2:封装函数写成无返回值格式

代码:

问题代码:

// 读取文件
public boolean requestFile(File file, HttpServletRequest request, HttpServletResponse response) throws IOException {
ServletOutputStream out = null;// Servlet输出流
FileInputStream ips = null;// 文件输入流
try {
String fileName = file.getName();
// 文件名编码
if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) {
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
}
// 设置响应头,控制浏览器下载该文件
response.setContentType(Utils.getFileType(fileName));// 描述消息内容类型
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
response.setContentLengthLong(file.length());
ips = new FileInputStream(file);
out = response.getOutputStream();
// 读取文件流
int len = 0;
byte[] buffer = new byte[1024 * 10];
while ((len = ips.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.flush();
} catch (Exception e) {
    return false;
} finally {
if (out != null)
out.close();
if (ips != null)
ips.close();
}
  return true;
}

正确代码:

// 读取文件
public void requestFile(File file, HttpServletRequest request, HttpServletResponse response) throws IOException {
ServletOutputStream out = null;// Servlet输出流
FileInputStream ips = null;// 文件输入流
try {
String fileName = file.getName();
// 文件名编码
if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) {
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
}
// 设置响应头,控制浏览器下载该文件
response.setContentType(Utils.getFileType(fileName));// 描述消息内容类型
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
response.setContentLengthLong(file.length());
ips = new FileInputStream(file);
out = response.getOutputStream();
// 读取文件流
int len = 0;
byte[] buffer = new byte[1024 * 10];
while ((len = ips.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.flush();
} catch (Exception e) {
} finally {
if (out != null)
out.close();
if (ips != null)
ips.close();
}
}

以上为个人总结,欢迎斧正

最新文章

  1. DataTable与实体类互相转换
  2. QML Image: Cannot open: qrc:///new.pic.png
  3. cocos2dx游戏开发——微信打飞机学习笔记(二)——游戏框架
  4. 【转】Linux终端下 dstat 监控工具
  5. YTU 3025: 创建二叉树
  6. DPM总结
  7. linux-LINUX试题
  8. nginx+ffmpeg搭建rtmp转播rtsp流的flash服务器
  9. MySQL索引视图
  10. QueryPerformanceFrequency使用方法--Windows高精度定时计数
  11. JavaScript权威指南阅读笔记3
  12. Ecstore中的微信支付怎么样配置
  13. vim下高级操作以及文本替换命令
  14. bzoj3110: [Zjoi2013]K大数查询 【cdq分治&树套树】
  15. Selenium 显示等待和隐式等待
  16. Windows 和 Mac 系统下安装git 并上传,修改项目
  17. 在Mac OS 下 build Tesseract4.0 源码并在命令行中使用
  18. BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS
  19. WebGL 纹理颜色原理
  20. python全栈开发day101-认证组件、权限组件、频率组件

热门文章

  1. JavaFx 使用字体图标记录
  2. 如何去了解Spring
  3. SQL优化步骤
  4. IDEA生成带参数和返回值注释
  5. abstract关键字的使用
  6. MySQL 全局锁、表级锁、行级锁,你搞清楚了吗?
  7. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(31)-Fiddler如何抓取Android系统中Flutter应用程序的包
  8. 在 .NET 7上使用 WASM 和 WASI
  9. Pyside2 开发框架
  10. Docker | 常用命令——排错很有帮助