Java读取文件后文件被占用
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();
}
}
以上为个人总结,欢迎斧正
Java读取文件后文件被占用的更多相关文章
- java读取 500M 以上文件,java读取大文件
java 读取txt,java读取大文件 设置缓存大小BUFFER_SIZE ,Config.tempdatafile是文件地址 来源博客http://yijianfengvip.blog.163.c ...
- Java读取UTF-8格式文件第一行出现乱码——问号“?”及解决 And Java读带有BOM的UTF-8文件乱码原因及解决方法
測试样例: Java读取UTF-8的txt文件第一行出现乱码"?"及解决 test.txt文件内容: 1 00:00:06,000 --> 00:00:06,010 < ...
- C#使用File.Create()创建文件后资源被占用
由于文件被占用不能读写,所以报错“另一个程序正在使用此文件进程无法访问” 解决方法是在创建文件后立即Dispose掉 File.Create(path).Dispose();
- Java 读取excel表格文件
注意,本文使用的Jar包为jxl.jar,只能处理97-03版本xls格式的Excel jar包 maven依赖: <dependency> <groupId>net.sour ...
- JAVA读取本地html文件里的html文本
/** * 读取本地html文件里的html代码 * @param file File file=new File("文件的绝对路径") * @return */ public s ...
- Java读取本地json文件
背景 之前一直在弄一个Java爬虫,将爬取的信息保存到了数据库中.但这毕竟是一个课程设计,在设计前端GUI,展示数据的时候最开始是直接通过select语句从数据库中查找的,但我担心交给老师后,老师还要 ...
- java读取HDFS压缩文件乱码
java通过调用HDFS系统的FileSystem等API 直接读取HDFS的压缩文件会产生乱码 解决方法: 1.调用解码的API,解码后通过IO流处理. public static void mai ...
- java读取各种类型文件
用到的几个包 bcmail-jdk14-132.jar/bcprov-jdk14-132.jar/checkstyle-all-4.2.jar/FontBox-0.1.0-dev.jar/lucene ...
- Java读取修改Properties文件
properties文件是我们经常需要操作一种文件,它使用一种键值对的形式来保存属性集. 无论在学习上还是工作上经常需要读取,修改,删除properties文件里面的属性. 本文通过操作一个prope ...
- java读取本地txt文件并插入数据库
package com.cniia.ny.web.control.configManage; import java.io.BufferedReader; import java.io.File; i ...
随机推荐
- Python解决千年虫问题
#避免千年虫(日期bug)问题 千年虫:部分计算机程序使用年份后两位作为记录年份,当日期跳转到00时候,默认会解析为1900,造成系统紊乱 lst=[45,89,1998,00,75,33,1968, ...
- 4.MongoDB系列之索引(一)
1. 执行计划查看 db.getCollection('users').find({'username': 'shenjian'}).explain('executionStats') 结果查看,先大 ...
- node 学习笔记 模块和包的管理与使用
1.前言 对于各种编程语言,代码组织是很重要的.而模块是node中的代码组织机制,node中的很多功能都以模块划分,而模块中又封装了许多方法,而且不会改变全局作用域,极大的方便了各开发者的需求. 2. ...
- Selenium4+Python3系列(七) - Iframe、Select控件、交互式弹出框、执行JS、Cookie操作
前言 突然,想把所有之前未更新的常用Api操作.演示写出来,算是对API的一种完结吧. 下面按照Api模块来做逐一介绍. 一.iframe操作 iframe识别: 语法: driver.switch_ ...
- scrapy框架命令
scrapy startproject #创建scrapy项目 scrapy genspider test www.baidu.com #在项目下的spider目录下生成爬虫文件 test爬虫名称 w ...
- java8 (jdk 1.8) 新特性——Lambda
java8 (jdk 1.8) 新特性 --初步认识 1. 什么是lambda? 目前已知的是,有个箭头 -> 说一大段官方话,也没有任何意义 我们直接看代码: 之前我们创建线程是这样的 Ru ...
- windows server2016/2019在vmware上安装失败
问题:无法进入装机界面 现象一:打开虚拟机后进入虚拟bios界面,无法引导iso镜像 解决方法1:从虚拟机设置里,修改引导选项,如果需要修改启动盘则设置强制执行BIOS设置 下图为vsphere的截图 ...
- 流程编排、如此简单-通用流程编排组件JDEasyFlow介绍
作者:李玉亮 JDEasyFlow是企业金融研发部自研的通用流程编排技术组件,适用于服务编排.工作流.审批流等场景,该组件已开源(https://github.com/JDEasyFlow/jd-ea ...
- SpringCloud(十一)- 秒杀 抢购
1.流程图 1.1 数据预热 1.2 抢购 1.3 生成订单 (发送订单消息) 1.4 订单入库 (监听 消费订单消息) 1.5 查看订单状态 1.6 支付 (获取支付链接 ) 1.7 支付成功 微信 ...
- java - - spring:定时任务
转载:https://www.cnblogs.com/lishupeng/p/7680644.html 开启定时任务: <beans xmlns="http://www.springf ...