Java 关闭struts使用的FileInputStream';流结果

Java 关闭struts使用的FileInputStream';流结果,java,struts2,download,struts,fileinputstream,Java,Struts2,Download,Struts,Fileinputstream,我的web应用程序生成一个XML文件。我正在使用Struts2流结果来管理下载,下面是struts.xml中的操作: <action name="generateXML" class="navigation.actions.GenerateXML"> <result type="stream"> <param name="contentType">text/xml</param> <param name

我的web应用程序生成一个XML文件。我正在使用Struts2流结果来管理下载,下面是struts.xml中的操作:

<action name="generateXML" class="navigation.actions.GenerateXML">
    <result type="stream">
        <param name="contentType">text/xml</param>
        <param name="inputName">inputStream</param>
        <param name="bufferSize">1024</param>
    </result>
    ...
</action>
删除文件将不起作用,因为inputStream尚未关闭(该部分已注释掉)。但是,如果我在此时关闭它,用户下载的xml文件是空的,因为它的流在struts生成下载之前已经关闭。
除了使用定期删除服务器上临时文件的脚本外,struts完成后是否有办法关闭“inputStream”?

关闭输入流没有删除功能,但您可以自己编写。看

其思想是,您不传递FileInputStream,而是传递ClosingFileInputStream,这将在调用close时覆盖close并删除文件。struts将调用close():

public String execute() {    
    File xml = new File(filename);
        ...//fill the file with stuff
        setInputStream(new ClosingFileInputStream(xml));   
    }
有关更多信息,请参阅链接问题。

您无需这样做。 Struts2将注意关闭蒸汽本身,您只需创建一个输入流并进行设置

下面是struts2如何为您处理流关闭

public class StreamResult extends StrutsResultSupport {
  // removing all other code
      {
        // Flush
                oOutput.flush();
                }
                   finally {
                if (inputStream != null) inputStream.close();
                  if (oOutput != null) oOutput.close();
               }

    }
因此,由于struts2中的流是一种结果类型,它所做的是从您定义的流中拾取数据,然后刷新它并关闭它


我希望这能消除您的疑虑。

问题是,Struts完成后,我再也无法控制使用该流的文件,因此我无法删除它。马修的解决方案奏效了。马修的参考资料相当不错。另一个选项是在
invoke()
之后在拦截器中执行文件清理。这可能更具定制性,但在这种情况下可能并不重要。
public class StreamResult extends StrutsResultSupport {
  // removing all other code
      {
        // Flush
                oOutput.flush();
                }
                   finally {
                if (inputStream != null) inputStream.close();
                  if (oOutput != null) oOutput.close();
               }

    }