我有一个临时文件,其中包含通过 MTOM 二进制附件作为 SOAP 响应的一部分返回的数据。我想在方法调用“结束”(即完成传输)后立即将其丢弃。对我来说最好的方法是什么?我能弄清楚如何执行此操作的最佳方法是在 session 被销毁时删除它们,但我不确定是否有更“直接”的方法来执行此操作。
仅供引用,我没有使用 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 堆栈只读取文件一次,所以它可以工作。
该解决方案有点 hack,但在这种情况下似乎是最佳选择。
关于java - Tomcat 6 : how to delete temporary files after a web method call has ended?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/158568/