Как закрыть файл PST в Java?
Я использую java-libpst.0.7.jar для чтения сообщений PST. Я использую следующий код, чтобы открыть файл PST для чтения сообщений.
PSTFile pstFile = new PSTFile("Path of the pst file");
Мне нужно закрыть файл PST один раз после получения информации о сообщении. Но нет возможности закрыть файл PST. Как я могу это сделать?
Ответы
Ответ 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/.
Моим советом было бы пойти на более "проверенную" библиотеку там или, если это невозможно, изменить этот файл, чтобы открыть явный метод закрытия и перестроить его.