2008-10-01 39 views
9

我有一個臨時文件,其數據通過MTOM二進制附件作爲SOAP響應的一部分返回。只要方法調用「結束」(即完成傳送),我就想盡快清除它。我做這件事最好的辦法是什麼?我可以想出如何做到這一點的最好方法是在會話被銷燬時將其刪除,但我不確定是否有更直接的方法來實現此目的。Tomcat 6:如何在Web方法調用結束後刪除臨時文件?

僅供參考,我不使用安訊士,我使用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; 
} 
} 

回答

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堆棧只能讀取一次文件,因此它可以工作。

該解決方案有點破解,但在這種情況下似乎是最好的選擇。

+0

我喜歡這個解決方案!我的破解是將文件添加到會話變量,然後在用戶會話過期時刪除文件。我還放入了一個額外的檢查來刪除finalize()中的文件。 – 2009-09-18 21:00:43

0

你使用的是標準的java臨時文件嗎?如果是這樣,你可以這樣做:

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

對不起,也許我應該更具體。我可以在什麼時候刪除文件?我無法直接在我的@WebMethod註釋函數中,因爲Web方法響應尚未返回。 – 2008-10-01 16:50:35

0

你在這個webapp中設置的工作文件夾,你正在談論。你可以在一個已知的目錄中設置這個工作目錄嗎?如果是,那麼你可以在臨時工作目錄(你知道)找到臨時文件。一旦找到,你可以刪除它。

相關問題