Tomcat 6:如何在Web方法调用结束后删除临时文件?

时间:2008-10-01 16:43:04

标签: java web-services tomcat jax-ws

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

3 个答案:

答案 0 :(得分: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堆栈只读取文件一次,因此可以正常工作。

解决方案有点像黑客,但在这种情况下似乎是最好的选择。

答案 1 :(得分:0)

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

File script = File.createTempFile("temp", ".tmp", new File("./"));
... use the file ...
script.delete(); // delete when done.

答案 2 :(得分:0)

您在此webapp的上下文中设置的工作文件夹。您可以在已知目录中设置此工作目录吗?如果是,那么您可以在临时工作目录(您知道)中找到临时文件。找到后,您可以将其删除。