【发布时间】:2014-07-11 11:22:34
【问题描述】:
我正在研究一种以编程方式访问 Lotus Notes 数据库的方法,以收集有关给定时间段内记录的嵌入式附件的信息。
我的目标是查找给定时间段内的记录,然后使用 Apache-POI 获取有关文档大小、字符数等的元数据。
POI 部分工作正常,到目前为止,由于以下帮助,我已经能够访问 Lotus Notes 记录:
lotus notes search by date with Java api
这个答案还告诉我如何下载/复制附件:
How do I get all the attachments from a .nsf(lotus notes) file using java
从那里我可以使用我的 POI 代码完成我的工作,最后,只需删除复制的附件。这种方法基本上可行,但我想避免复制、保存然后最后从数据库中删除这些附加文档的副本的开销。
我尝试将 EmbeddedObject getSource() 方法的结果作为输入传递给我的 POI 代码,并在 POI 代码中得到一个 FileNotFoundException,它期望一个字符串来生成一个文件。
有没有一种方法可以获取我可以传递给 POI 的文件引用,而无需复制和保存附件?或者,我的意思是,它是否像获取 Lotus Notes EmbeddedObject 附件的文件(+路径)一样简单,我该怎么做?
我找到了答案并贴在下面。
【问题讨论】:
-
嘿,回答我自己的帖子可能是一种糟糕的形式,但我只是在 embeddeObject 中使用 getInputStream() 获得了一些运气。我将使用我几乎可以工作的解决方案编辑原始帖子。
-
POI 会非常愉快地从 InputStream 中打开东西,当您尝试这样做时,有什么不适合您?
-
@grooble,回答你自己的帖子是非常好的形式。我认为 getInputStream 是理想的解决方案是正确的:publib.boulder.ibm.com/infocenter/domhelp/v8r0/…
-
@grooble - 您应该将您的答案作为答案发布,然后接受它作为答案。你会因为这样做而获得一枚徽章(也许是银色的)!我们都需要徽章......
-
EmbeddedObject.getInputStream() 方法实际上在磁盘上保存了一个临时文件,然后为您打开它,因此您的代码并没有真正节省任何运行时开销。另外,要非常小心,因为除非您做两件事,否则临时文件将留在磁盘上:a) 关闭 InputStream,b) 回收 EmbeddedObject。如果您对大量文档执行此操作,则可能会耗尽磁盘空间。所以你需要分配InputStream stream = eo.getInputStream(),然后调用verifytAndBuildPOIFS(stream),然后当一切都完成后你需要调用stream.close()和eo.recycle()。
标签: java apache-poi lotus-notes