代码读取文件后,进行了关闭流,执行删除文件操作没有报错,文件还是存在。
类似这样的关闭
if (null != xwpfTUtil) {
xwpfTUtil.close(os);
xwpfTUtil.close(is);
}
if (null != os) {
os.flush();
os.close();
}
删除文件夹和文件的代码
public static void deleteFile(File file) {
// 如果dir对应的文件不存在,则退出
if (!file.exists()) {
return;
}
if (file.isFile()) {
file.delete();
} else {
File[] files = file.listFiles();
if (files != null) { // 防止listFiles()返回null的情况
for (File f : files) {
deleteFile(f);
LOG.info("删除文件成功!" + f.getPath());
}
}
file.delete();
LOG.info("删除文件夹!" + file.getPath());
}
}
原因:实际并没有关闭成功
解决:使用try-with-resources语句来自动管理这些资源。只要有流的地方都把用try包裹起来
FileOutputStream os = new FileOutputStream(fileName); 代码内容
改为
try (FileOutputStream os = new FileOutputStream(fileName)) { 其他代码内容包含在这里 }
private static void writeZip(List<String> files, String zipname) throws IOException {
String fileName = zipname + ".zip";
HttpServletResponse response = ServletActionContext.getResponse();
try (OutputStream os = response.getOutputStream()) {
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
response.setContentType("application/x-zip-compressed");
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
try (ZipOutputStream zos = new ZipOutputStream(os)) {
byte[] buf = new byte[8192];
int len;
for (int i = 0; i < files.size(); i++) {
File file = new File(files.get(i));
if (!file.isFile()) continue;
ZipEntry ze = new ZipEntry(file.getName());
zos.putNextEntry(ze);
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {
while ((len = bis.read(buf)) > 0) {
zos.write(buf, 0, len);
}
}
zos.closeEntry();
}
zos.closeEntry();
}
}
}