9

我有一个临时文件,其中包含通过 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;
 }
}
4

3 回答 3

16

我遇到了同样的问题。问题是 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 堆栈只读取文件一次,因此它可以工作。

该解决方案有点棘手,但在这种情况下似乎是最佳选择。

于 2009-06-11T14:29:05.007 回答
0

你在使用标准的 java 临时文件吗?如果是这样,您可以这样做:

File script = File.createTempFile("temp", ".tmp", new File("./"));
... use the file ...
script.delete(); // delete when done.
于 2008-10-01T16:48:43.460 回答
0

您在上下文中为您正在谈论的这个 web 应用程序设置的工作文件夹。您可以将此工作目录设置在已知目录中吗?如果是,那么您可以在临时工作目录(您知道)中找到临时文件。找到后,您可以将其删除。

于 2008-10-01T20:31:51.130 回答