2014-11-27 15 views
20

Używam java-libpst.0.7.jar do czytania wiadomości PST. Korzystam z następującego kodu, aby otworzyć plik PST w celu odczytania wiadomości.Jak zamknąć plik PST w Javie?

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

Muszę zamknąć plik PST raz po uzyskaniu szczegółów wiadomości. Ale nie ma opcji, aby zamknąć plik PST. Jak mogę to zrobić?

+0

Mam aplikację do odczytu plików PST. Aplikacja nie może odczytać pliku pst, który jest dostępny w innej aplikacji. Jeśli użyję powyższego kodu, aplikacja nie może odczytać pliku pst. Aplikacja może odczytać raz po ponownym uruchomieniu systemu. –

Odpowiedz

49

Odczytując kod, oczywistym jest, że biblioteka libpst rzeczywiście nie ujawnia metody "zamknięcia". Metoda finalize() zamyka plik leżący u podstaw, gdy PSTFile jest zbędny, dlatego zalecam użycie go w możliwie najmniejszym zakresie i pozbycie się go JAK NAJSZYBCIEJ, ale poza tym niewiele możesz zrobić (poza reporting an issue to the project - lub jeszcze lepiej, oczywiście wysyłając łatkę).

EDIT 1:
PSTFile ma getFileHandle() metodę, która zwraca plik bazowego, więc można close() że:

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

EDIT 2:
Utworzyłem pull request dodać PSTFile.close(). Zobaczmy, jak to kibicuje.

EDYTUJ 3:
Moja prośba o połączenie została scalona (dzięki Richard Johnson!). W następnej wersji (lub jeśli samodzielnie zbudujesz java-libpst), będziesz mógł zadzwonić bezpośrednio pod numer close() pod numerem PSTFile.

1

PSTFile zamyka uchwyt pliku w metodzie finalize, więc plik jest zamykany, gdy dysk PSTFile jest zbędny. Nie sądzę, aby to był dobry sposób na porządkowanie zasobów w ten sposób, ponieważ finalize można nazwać znacznie później lub nawet nigdy.

+0

Mam aplikację do odczytu plików PST. Aplikacja nie może odczytać pliku pst, który jest dostępny w innej aplikacji. Jeśli użyję powyższego kodu, aplikacja nie może odczytać pliku pst. Aplikacja może odczytać raz po ponownym uruchomieniu systemu. –

+0

Prawdopodobnie dlatego, że plik nadal nie jest zamknięty. Kończenie aplikacji zamyka uchwyt pliku. Jak zauważyli Mureinik i Adrian B., nie używałbym biblioteki w obecnym stanie. Może PSTFile może implementować AutoCloseable. – Drunix

1

Podobnie jak @RC, biblioteka nie udostępnia metody zamkniętej. Spójrz na https://github.com/rjohnsondev/java-libpst/blob/master/src/main/java/com/pff/PSTFile.java. Autor przejął metodę finalize(), oczekując, że strumień będzie w magiczny sposób zamykany podczas zbierania śmieci.

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

Jednak, zbieranie śmieci nie jest gwarantowane przez cały czas trwania aplikacji, a mimo to, nie jest to również sfinalizowanie(). Zobacz jeden z wielu artykułów w Internecie wyjaśniający, dlaczego: http://howtodoinjava.com/2012/10/31/why-not-to-use-finalize-method-in-java/.

Moja rada to pójść na bardziej "sprawdzoną" bibliotekę tam, lub jeśli nie jest to możliwe, zmienić ten plik, aby odsłonić metodę zamknięcia jawnego i odbudować ją.