Tomcat 6:如何在Web方法调用结束后删除临时文件?
时间:2020-03-06 14:59:09 来源:igfitidea点击:
我有一个临时文件,其中的数据是通过MTOM二进制附件作为SOAP响应的一部分返回的。我想在方法调用"结束"(即完成传输)后立即对其进行垃圾处理。对我来说最好的方法是什么?我能弄清楚如何执行此操作的最佳方法是在会话被销毁时将其删除,但是我不确定是否有更"直接"的方法来执行此操作。
仅供参考,如果需要的话,我不使用Axis,而是使用jax-ws。
更新:我不确定回答者是否真的了解这个问题。我知道如何在Java中删除文件。我的问题是这样的:
@javax.jws.WebService public class MyWebService { ... @javax.jws.WebMethod public MyFileResult getSomeObject() { File mytempfile = new File("tempfile.txt"); MyFileResult result = new MyFileResult(); result.setFile(mytempfile); // sets mytempfile as MTOM attachment // mytempfile.delete() iS WRONG // can't delete mytempfile because it hasn't been returned to the web service client // yet. So how do I remove it? return result; } }
解决方案
我们是否正在使用标准的Java临时文件?如果是这样,我们可以执行以下操作:
File script = File.createTempFile("temp", ".tmp", new File("./")); ... use the file ... script.delete(); // delete when done.
我们要在此上下文中为此Web应用程序在上下文中设置的工作文件夹。我们可以在已知目录中设置此工作目录吗?如果是,则可以在临时工作目录(我们知道)中找到临时文件。找到后,我们可以将其删除。
我遇到了同样的问题。问题是JAX-WS堆栈管理文件。无法在代码中确定何时对文件执行JAX-WS,因此我们不知道何时删除它。
就我而言,我在对象模型而不是文件上使用DataHandler。 MyFileResult将具有以下字段而不是文件字段:
private DataHandler handler;
我的解决方案是创建FileDataSource的自定义版本。我没有返回FileInputStream来读取文件的内容,而是返回了FileInputStream的以下扩展名:
private class TemporaryFileInputStream extends FileInputStream { public TemporaryFileInputStream(File file) throws FileNotFoundException { super(file); } @Override public void close() throws IOException { super.close(); file.delete(); } }
本质上,数据源只允许读取一次。流关闭后,文件将被删除。由于JAX-WS堆栈仅读取一次文件,因此它可以工作。
该解决方案有点麻烦,但在这种情况下似乎是最佳选择。