20

PST メッセージの読み取りに java-libpst.0.7.jar を使用しています。次のコードを使用して PST ファイルを開いてメッセージを読んでいます。

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

メッセージの詳細を取得したら、一度 PST ファイルを閉じる必要があります。ただし、PST ファイルを閉じるオプションはありません。これどうやってするの?

4

3 に答える 3

50

コードを読むと、libpst が実際に「閉じる」メソッドを公開していないことが明らかです。このfinalize()メソッドはガベージ コレクションの際に基になるファイルを閉じるPSTFileため、可能な限り最小のスコープで使用し、できるだけ早く破棄することをお勧めしますが、それ以外にできることはあまりありません (問題をプロジェクト- またはもちろん、自分でパッチを送信することをお勧めします)。

EDIT 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 に感謝します!)。close()次のリリース (または自分で java-libpst をビルドした場合)では、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() メソッドをオーバーライドしました。

/**
  * destructor just closes the file handle...
  */
@Override
protected void finalize() throws IOException {
    in.close();
}

ただし、ガベージ コレクションはアプリケーションの存続期間全体にわたって保証されるわけではなく、そうであっても finalize() の実行も保証されません。理由を説明しているネット上の多くの記事の 1 つを参照してください: http://howtodoinjava.com/2012/10/31/why-not-to-use-finalize-method-in-java/

私のアドバイスは、より「実績のある」ライブラリを使用するか、それが不可能な場合は、そのファイルを変更して明示的な close メソッドを公開し、再構築することです。

于 2014-11-27T07:04:06.357 に答える