有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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也执行方法,没有任何异常。有什么问题吗


共 (2) 个答案

  1. # 1 楼答案

    其实很简单。我忘了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(); 
    }
    
  2. # 2 楼答案

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

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

    尽管这可能无法解决问题

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

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

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


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

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

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