20

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

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

获得消息详细信息后,我必须关闭 PST 文件一次。但是没有关闭 PST 文件的选项。我怎样才能做到这一点?

4

3 回答 3

50

通过阅读代码,很明显 libpst 确实没有公开“关闭”方法。该finalize()方法会在垃圾收集时关闭底层文件PSTFile,因此我建议在尽可能小的范围内使用它并尽快处理它,但除此之外你无能为力(除了向项目——或者更好的是,当然,你自己发送一个补丁)。

编辑1:
PSTFile有一个getFileHandle()返回底层文件的方法,所以你可以close()

PSTFile pstFile = new PSTFile("Path of the pst file");
// use the file
pstFile.getFileHandle().close();

编辑 2:
我创建了一个拉取请求来添加PSTFile.close(). 让我们看看它是如何扇出的。

编辑 3:
我的拉取请求已被合并(感谢 Richard Johnson!)。在下一个版本中(或者如果您自己构建 java-libpst),您将能够直接调用close()a PSTFile

于 2014-11-27T07:03:26.480 回答
1

PSTFile在其finalize方法中关闭文件句柄,因此在PSTFile垃圾收集时关闭文件。我不认为以这种方式清理资源的好方式,因为finalize可能会在很久以后甚至永远不会调用。

于 2014-11-27T07:03:25.103 回答
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/

我的建议是去那里寻找一个更“经过验证”的库,或者,如果不可能,更改该文件以公开一个明确的关闭方法并重建它。

于 2014-11-27T07:04:06.357 回答