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