Java读取文件后文件被占用

2023-02-27,,

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读取文件后文件被占用.doc》

下载本文的Word格式文档,以方便收藏与打印。