java如何在将文档提交给客户端后删除它
我有一个按钮,可以为客户端生成docx文件。我遇到的问题是,在将生成的文件提供给客户端后,我无法删除该文件。服务器端技术是JSF(XPages)。该按钮调用以下代码:
var v = new ru.generate.doc.generateDoc();
v.generateReport2();
generateReport2()
方法调用了两个重要的方法generateFromTemplateAndReturnPath(String template)
:
private String generateFromTemplateAndReturnPath(String pathToTemplate)
{
XWPFDocument document = new XWPFDocument(OPCPackage.open(pathToTemplate));
String pathToFinalResult = FilenameUtils.getFullPath(pathToTemplate) + "reportTest.docx";
FileOutputStream fous = new FileOutputStream(pathToFinalResult);
document.write(fous);
fous.close();
return pathToFinalResult;
}
以及向客户提供报告的giveDocumentForClient(String pathToCompleteFile)
方法:
private void giveDocumentForClient(String pathToCompleteFile) throws InvalidFormatException, IOException
{
String fn = new File(pathToCompleteFile).getName();
XspHttpServletResponse response = (XspHttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
response.setContentType(URLConnection.guessContentTypeFromName(fn));
response.setHeader("Content-disposition", "attachment; filename=" + fn);
OutputStream output = response.getOutputStream();
output.write(IOUtils.toByteArray(new FileInputStream(new File(pathToCompleteFile))));
output.close();
FacesContext.getCurrentInstance().responseComplete();
}
在这个方法完成后,我尝试在generateReport2()
中删除它:
new File(pathToCompleteFile).delete()
不管我做什么,这个方法都返回false。我也尝试过:
FileDeleteStrategy.FORCE.delete(new File(pathToSubstitutedDoc))
但仍然没有结果
像canRead()、canWrite()和canExecute()这样的方法总是返回true。SecurityManager也执行方法,没有任何异常。有什么问题吗
# 1 楼答案
其实很简单。我忘了FileInputStream也应该关闭
方法应该如下所示:
# 2 楼答案
您可以尝试更好的文件类:
尽管这可能无法解决问题
如果不可删除,则文件在生成期间未关闭。由于应用程序仍在运行,因此文件句柄将得到维护。尤其是 在Windows下可能就是这样
(或者这将是一个文件权限的问题。但是您选中了:SecurityManager和canRead)
还有一些深奥的案例,比如病毒扫描器
在查看生成代码之后;做:
这种资源尝试确保了自动关闭,即使在异常/中断/返回时也是如此