今天在项目中开发文件导出时,使用了临时文件,当临时文件用完后为了减少存储占用,因此需要将临时文件删除,使用文件删除方法“file.delete()” ,会出现编辑器提示“'File.delete()'的结果将被忽略”(会导致文件删除是有时成功有时失败的情况,因此心想把这个问题解决掉并做一个记录)
如图所示位置报错【Result of ‘file.delete()’ is ignored】
此时通过布尔捕获到file.delete() 的值,将不会出现结果被忽略的情况。
通过此方式代码中getTmpFIle.delete()就没有报错了,调用方法执行后输出结果有如下两种情况:
当输出为true时,则为文件存在删除成功
当输出为false时,则为删除失败,文件存在或被占用
临时文件代码工具类如下
public static void exportExcelData(HSSFWorkbook hssfWorkbook, String fileName, HttpServletResponse response){
FileOutputStream fos = null;
FileInputStream fis = null;
OutputStream outputStream = null;
File getTmpFile = null;
try {
// 设置日期格式
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
// new Date()为获取当前系统时间
String newFileName = fileName + "_" + df.format(System.currentTimeMillis());
// 临时文件,为了减少内存占用
String fileNamePath = FileCommon.getPath() + "templates/" + newFileName + ".xlsx";
// 2.设置头信息
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel;charset=utf-8");
// 3.一定要设置成xlsx格式
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(newFileName + ".xlsx", "UTF-8"));
// 4.创建一个输出流, 使用了BufferedOutputStream,能加快导出速度,不用也可以
outputStream = new BufferedOutputStream(response.getOutputStream(),6144);
// 获取excel表格大小(字节长度)
int length = hssfWorkbook.getBytes().length;
// 5.写入数据,判定文件大小选择不同方式输出文件,当文件大于500KB时,临时文件的方式,否则直接输出即可
if( length > (0.5 * 1024 * 1024)){
// 方案一:先写入excel临时文件中在输出至前端页面,以减少内存占用
fos = new FileOutputStream(fileNamePath);
hssfWorkbook.write(fos);
fos.close();
hssfWorkbook.close();
getTmpFile=new File(fileNamePath);
fis = new FileInputStream(getTmpFile);
IOUtils.copy(fis, outputStream);
System.out.println("----------------" + length);
}else{
// 方案二:直接将文件输出至前端
hssfWorkbook.write(outputStream);
System.out.println("===============" + length);
}
// 6.关闭流
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(fis !=null) {
fis.close();
}
if(outputStream!=null){
outputStream.close();
}
if(getTmpFile !=null && getTmpFile.exists() && getTmpFile.isFile()){
getTmpFile.delete();
}
} catch (Exception e){
e.printStackTrace();
}
}
}
至此问题解决,如果对你有帮助就点个赞吧!
(看见提示就想解决,有木有同款朋友,O(∩_∩)O哈哈~)