Java 关闭struts使用的FileInputStream';流结果
我的web应用程序生成一个XML文件。我正在使用Struts2流结果来管理下载,下面是struts.xml中的操作: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
<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();
}
}