我正在使用 java-libpst.0.7.jar 来读取 PST 消息。我正在使用以下代码打开 PST 文件以读取消息。
PSTFile pstFile = new PSTFile("Path of the pst file");
获得消息详细信息后,我必须关闭 PST 文件一次。但是没有关闭 PST 文件的选项。我怎样才能做到这一点?
通过阅读代码,很明显 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
。
PSTFile
在其finalize
方法中关闭文件句柄,因此在PSTFile
垃圾收集时关闭文件。我不认为以这种方式清理资源的好方式,因为finalize
可能会在很久以后甚至永远不会调用。
就像@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/。
我的建议是去那里寻找一个更“经过验证”的库,或者,如果不可能,更改该文件以公开一个明确的关闭方法并重建它。