Подтвердить что ты не робот

Как закрыть файл PST в Java?

Я использую java-libpst.0.7.jar для чтения сообщений PST. Я использую следующий код, чтобы открыть файл PST для чтения сообщений.

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

Мне нужно закрыть файл PST один раз после получения информации о сообщении. Но нет возможности закрыть файл PST. Как я могу это сделать?

4b9b3361

Ответ 1

Читая код, очевидно, что libpst действительно не раскрывает метод "close". Метод finalize() закрывает базовый файл, когда PSTFile собирает мусор, поэтому я бы рекомендовал использовать его в наименьшей возможной области и избавиться от него как можно скорее, но кроме этого вы не можете много сделать ( кроме сообщать о проблеме в проект - или еще лучше, отправляя патч самостоятельно, конечно).

РЕДАКТИРОВАТЬ 1:
PSTFile имеет метод getFileHandle(), который возвращает базовый файл, поэтому вы можете close() что:

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

РЕДАКТИРОВАТЬ 2:
Я создал запрос pull, чтобы добавить PSTFile.close(). Давайте посмотрим, как это происходит.

РЕДАКТИРОВАТЬ 3:
Мой запрос на загрузку был объединен (спасибо Ричарду Джонсону!). В следующем выпуске (или если вы создадите java-libpst самостоятельно) вы сможете напрямую вызвать close() на PSTFile.

Ответ 2

PSTFile закрывает дескриптор файла в методе finalize, поэтому файл закрывается, когда ваш PSTFile собирает мусор. Я не думаю, что это хороший стиль для очистки ресурсов таким образом, потому что finalize можно назвать намного позже или даже никогда.

Ответ 3

Как и @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/.

Моим советом было бы пойти на более "проверенную" библиотеку там или, если это невозможно, изменить этот файл, чтобы открыть явный метод закрытия и перестроить его.