Java 如何在将文档交给客户后删除文档

Java 如何在将文档交给客户后删除文档,java,file,jsf,xpages,ssjs,Java,File,Jsf,Xpages,Ssjs,我有一个为客户端生成docx文件的按钮。我遇到的问题是,在将生成的文件提供给客户端之后,我无法删除该文件。服务器端技术是JSF(XPages)。该按钮调用以下代码: var v = new ru.generate.doc.generateDoc(); v.generateReport2(); generateReport2()方法调用了两个重要的方法generateFromTemplateAndReturnPath(字符串模板): 以及将报告提供给客户端的giveDocumentForClie

我有一个为客户端生成docx文件的按钮。我遇到的问题是,在将生成的文件提供给客户端之后,我无法删除该文件。服务器端技术是JSF(XPages)。该按钮调用以下代码:

var v = new ru.generate.doc.generateDoc();
v.generateReport2();
generateReport2()
方法调用了两个重要的方法
generateFromTemplateAndReturnPath(字符串模板)

以及将报告提供给客户端的
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()
中删除此选项:

不管我做什么,这个方法都返回false。我也尝试过:

FileDeleteStrategy.FORCE.delete(新文件(pathToSubstitutedDoc))

但仍然没有结果


像canRead()、canWrite()和canExecute()这样的方法总是返回true。SecurityManager也执行方法,没有任何异常。有什么问题

您可以尝试更好的文件类:

  OutputStream output = response.getOutputStream();
  Files.copy(Paths.get(pathToCompleteFile), output);

  Files.delete(Paths.get(pathToCompleteFile));
尽管这可能无法解决问题

如果不可删除,则文件在生成期间未关闭。由于应用程序仍在运行,因此会维护文件句柄。这尤其 在Windows下可能就是这样

(或者这将是一个文件权限的问题。但是您选中了:SecurityManager和canRead。)

还有一些深奥的案例,比如病毒扫描器


在查看生成代码之后;做:

      try (FileOutputStream fous = new FileOutputStream(pathToFinalResult)) {
          document.write(fous);
      } // Automatic fous.close() even on exception or return.

这种使用资源的尝试确保了自动关闭,即使在异常/中断/返回时也是如此。

好吧,这真的很简单。我忘了FileInputStream也应该关闭

方法应如下所示:

private void giveDocumentForClient(String pathToCompleteFile) throws InvalidFormatException, IOException 
{
      FileInputStream fis = new FileInputStream(new File(pathToCompleteFile));
      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(fis));
      output.close();
      fis.close();
      FacesContext.getCurrentInstance().responseComplete(); 
}

我忘了提到一些东西,请看一看啊,使用Java版本7:(然后是一个try finally close块。没有看到任何异常处理(可能是问题的简化)。只是为了确保:您将文件名连接到一个路径,它是否以
/
结尾?嗯,我认为问题与HTTP有关。单击后“创建报告”按钮,即使在Windows中,我也无法删除该文件。它会告诉我“该操作无法完成,因为该文件已在nhttp.exe中打开。”“。但只要我点击浏览器中的刷新按钮,一切都很好-文件可以被删除..您应该考虑的是:与其使用FOU来写入文件,不如在那里使用response.getOutputStream()(将其作为参数传递给该函数)。不会给您留下要处理的文件。内容处置中的文件名可以自由选择。命名时要让用户觉得有意义。例如,在名称中包含日期(如果有意义)
      try (FileOutputStream fous = new FileOutputStream(pathToFinalResult)) {
          document.write(fous);
      } // Automatic fous.close() even on exception or return.
private void giveDocumentForClient(String pathToCompleteFile) throws InvalidFormatException, IOException 
{
      FileInputStream fis = new FileInputStream(new File(pathToCompleteFile));
      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(fis));
      output.close();
      fis.close();
      FacesContext.getCurrentInstance().responseComplete(); 
}