2012-09-20 36 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,以防异常阻止对象首先被实例化。) –