我有一个临时文件,其中的数据是通过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; } }
我遇到了同样的问题。问题是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堆栈仅读取一次文件,因此它可以工作。
该解决方案有点麻烦,但在这种情况下似乎是最佳选择。