如何在Java中关闭PST文件?

时间:2014-11-27 06:53:10

标签: java pst

我使用java-libpst.0.7.jar来读取PST消息。我使用以下代码打开PST文件来阅读邮件。

PSTFile pstFile = new PSTFile("Path of the pst file");

我必须在收到消息详细信息后关闭PST文件一次。但是没有选项可以关闭PST文件。我怎么能这样做?

3 个答案:

答案 0 :(得分:51)

通过阅读代码,很明显libpst确实没有公开"关闭"方法。当finalize()被垃圾收集时,PSTFile方法会关闭基础文件,因此我建议尽可能在最小范围内使用它并尽快处理它,但除此之外#39;你做的不多(reporting an issue to the project除外 - 或者更好,当然是自己发送补丁)。

编辑1:
PSTFilegetFileHandle()方法返回基础文件,因此您可以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)

PSTFilefinalize方法中关闭文件句柄,因此当您的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方法并重建它。