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

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

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

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


person murali Karthick    schedule 27.11.2014    source источник
comment
У меня есть приложение для чтения файлов PST. Приложению не удалось прочитать PST-файл, к которому есть доступ в каком-то другом приложении. Если я использую приведенный выше код, приложение не сможет прочитать файл pst. Приложение может прочитать один раз после перезагрузки системы.   -  person murali Karthick    schedule 27.11.2014


Ответы (3)


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

EDIT 1:
PSTFile имеет метод getFileHandle(), который возвращает базовый файл, поэтому вы можете close() сделать следующее:

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

EDIT 2:
я создал запрос на извлечение для добавить PSTFile.close(). Посмотрим, как он развернется.

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

person Mureinik    schedule 27.11.2014

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

person Drunix    schedule 27.11.2014
comment
У меня есть приложение для чтения файлов PST. Приложению не удалось прочитать PST-файл, к которому есть доступ в каком-то другом приложении. Если я использую приведенный выше код, приложение не сможет прочитать файл pst. Приложение может прочитать один раз после перезагрузки системы. - person murali Karthick; 27.11.2014
comment
Возможно, потому что файл все еще не закрыт. Завершение вашего приложения закрывает дескриптор файла. Как отметили Мурейник и Адриан Б., я бы не стал использовать библиотеку в текущем состоянии. Возможно, PSTFile мог бы реализовать AutoCloseable. - person Drunix; 27.11.2014

Как сказал @RC, библиотека не предоставляет закрытый метод. Посмотрите на 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/ .

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

person Adrian B.    schedule 27.11.2014