2012-09-20 38 views
3

我試圖提取使用EmbeddedObjects附件EO * TM的文件,我能提取附件,但創建EM * TM的臨時文件在系統臨時文件夾。提取附件,創建在系統文件夾

EmbeddedObject embeddedObject=document.getAttachment(attachmentName); 
InputStream inputStream=embeddedObject.getInputStream(); 
..... 
...... 
inputStream.close(); 
embeddedObject..recycle(); 
document..recycle(); 

在關閉輸入流之後,將其不刪除臨時文件的窗口系統臨時文件夾。 在我的代碼或蓮花筆記的設置問題中,它有什麼問題嗎?

能否請你幫我在這?

感謝您的幫助。

+0

embeddedObject.recycle(); document.recycle(); 對不起,它的.recycle();它不是..recycle(); – Sarma

+0

嗯......當我忘記關閉InputStream時,我遇到了那些臨時文件。事實上,我向IBM提交了一份報告,因爲那時文檔從未提及關閉流的要求。現在確實如此。實際上,文檔現在包含了我向IBM建議的確切語言。所以這很神祕。如果這是一個普遍可重現的情況,那將是一個嚴重的錯誤。你使用的是什麼版本的Notes或Domino? –

+0

感謝您的回覆,我正在使用Lotus Notes 8. – Sarma

回答

3

這是一個常見的問題,並且本發明涉及的對象(丟失或不按順序)的不正確的關閉/再循環。 E0 * TM文件將在對象處於活動狀態並在回收時進行清理時創建。

如果它們是正確的,然後檢查,看看是否有殺毒軟件運行阻止刪除。

我以前的作品之前,測試這一點,所以比較你下面的示例代碼。

try { 

    System.out.println("Start"); 
    String path = "test.txt";  

    Session session = getSession(); 
    AgentContext agentContext = session.getAgentContext(); 

    System.out.println("Get DB");  
    Database db = session.getCurrentDatabase(); 

    System.out.println("View + doc");  
    View vw = db.getView("main");  
    Document doc = vw.getFirstDocument();  

    System.out.println("Embedded object"); 
    EmbeddedObject att = doc.getAttachment(path);  
    InputStream is = att.getInputStream(); 
    ByteArrayOutputStream fos = new ByteArrayOutputStream(); 

    byte buffer[] = new byte[(int) att.getFileSize()]; 
    int read;  
    do { 
    read = is.read(buffer, 0, buffer.length); 
    if (read > 0) { 
    fos.write(buffer, 0, read);  
    } 
    } while (read > -1); 

    fos.close(); 
    is.close(); 

    // recycle the domino variables 
    doc.recycle(); 
    vw.recycle();  
    db.recycle();  
    att.recycle(); 

    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
+0

我的代碼也類似於您的代碼(int i = 0; i Sarma

+0

一旦代理完成做的文件得到清理如果不嘗試Sysinternals t ool進程經理監視什麼是觸及這些文件。 –

1

我的建議是,首先註釋掉所有您在您的文章表示

..... 
...... 

是否臨時文件仍然被甩在後面的代碼?如果是這樣,它看起來像是8.x的Notes後端類中的一個缺陷,需要向IBM報告。

如果沒有,那麼什麼東西在註釋掉的代碼是防止接替關閉()調用。 InputStream是一個抽象類,因此您可能將inputStream綁定到另一個必須關閉的流對象類型,以防止文件保持打開狀態。

+0

.....之間的代碼是創建新的DTO(數據傳輸對象)對象,並將所有附件屬性和文檔標題信息放入DTO對象中。附件屬性意味着附件名稱,大小,地址等...我試圖評論每一件事仍然是它的創建eo..tm文件。我寫了一個批處理文件,每小時刪除一次。它的工作,但它不是一個修復。 感謝您的幫助。讚賞 – Sarma

+0

這是非常有趣的信息。謝謝。我將不得不去檢查我們使用EmbeddedObject.getInputStream()的代碼來查看它是否已經回到了離開文件的位置。 –

+0

還有一個想法:是否有可能你的代碼吞沒了一個異常,而不是實際調用recyle()方法?我通常會將recycle()調用放到finally {}塊中,這是可以肯定的。 (我在調用recycle()之前也檢查了null,以防異常阻止對象首先被實例化。) –