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

时间:2020-03-06 14:59:09  来源:igfitidea点击:

我有一个临时文件,其中的数据是通过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;
 }
}

解决方案

我们是否正在使用标准的Java临时文件?如果是这样,我们可以执行以下操作:

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

我们要在此上下文中为此Web应用程序在上下文中设置的工作文件夹。我们可以在已知目录中设置此工作目录吗?如果是,则可以在临时工作目录(我们知道)中找到临时文件。找到后,我们可以将其删除。

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

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