我使用java-libpst.0.7.jar来读取PST消息。我使用以下代码打开PST文件来阅读邮件。
PSTFile pstFile = new PSTFile("Path of the pst file");
我必须在收到消息详细信息后关闭PST文件一次。但是没有选项可以关闭PST文件。我怎么能这样做?
答案 0 :(得分:51)
通过阅读代码,很明显libpst确实没有公开"关闭"方法。当finalize()
被垃圾收集时,PSTFile
方法会关闭基础文件,因此我建议尽可能在最小范围内使用它并尽快处理它,但除此之外#39;你做的不多(reporting an issue to the project除外 - 或者更好,当然是自己发送补丁)。
编辑1:
PSTFile
有getFileHandle()
方法返回基础文件,因此您可以close()
:
PSTFile pstFile = new PSTFile("Path of the pst file");
// use the file
pstFile.getFileHandle().close();
编辑2:
我已创建了pull request来添加PSTFile.close()
。让我们看看它是如何粉丝的。
编辑3:
我的拉请求已经合并(感谢理查德约翰逊!)。在下一个版本中(或者如果您自己构建java-libpst),您将能够直接在close()
上致电PSTFile
。
答案 1 :(得分:1)
PSTFile
在finalize
方法中关闭文件句柄,因此当您的PSTFile
被垃圾回收时文件将被关闭。我不认为以这种方式清理资源是一种很好的方式,因为finalize
可能会被调用得更晚,甚至永远不会。
答案 2 :(得分:1)
就像@RC所说,该库没有公开close方法。看看https://github.com/rjohnsondev/java-libpst/blob/master/src/main/java/com/pff/PSTFile.java。作者覆盖了finalize()方法,期望Stream在垃圾收集时神奇地关闭。
/**
* destructor just closes the file handle...
*/
@Override
protected void finalize() throws IOException {
in.close();
}
但是,在应用程序的整个生命周期中都不能保证垃圾收集,即便如此,也不会运行finalize()。请参阅网上的许多文章之一,解释原因:http://howtodoinjava.com/2012/10/31/why-not-to-use-finalize-method-in-java/。
我的建议是去寻求更多经过证实的"那里的库,或者,如果不可能,更改该文件以公开一个显式的close方法并重建它。