我有一个临时文件,其中包含通过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; } }
Chris Dail.. 15
我遇到了同样的问题.问题是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堆栈只读取一次文件,因此可以正常工作.
解决方案有点像黑客,但在这种情况下似乎是最好的选择.
我遇到了同样的问题.问题是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堆栈只读取一次文件,因此可以正常工作.
解决方案有点像黑客,但在这种情况下似乎是最好的选择.