2014-11-27 3 views
20

PST 메시지를 읽는 데 java-libpst.0.7.jar을 사용하고 있습니다. 메시지를 읽으려면 PST 파일을 열려면 다음 코드를 사용하고 있습니다.Java에서 PST 파일을 닫는 방법?

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

메시지 세부 정보를받은 후 한 번 PST 파일을 닫아야합니다. 그러나 PST 파일을 닫을 수있는 옵션이 없습니다. 어떻게해야합니까?

+0

PST 파일을 읽을 수있는 응용 프로그램이 있습니다. 응용 프로그램이 다른 응용 프로그램에서 액세스하는 pst 파일을 읽을 수 없습니다. 위 코드를 사용하면 응용 프로그램이 pst 파일을 읽을 수 없습니다. 응용 프로그램을 다시 시작한 후 응용 프로그램을 읽을 수 있습니다. –

답변

49

코드를 읽으면 libpst가 실제로 "닫기"메소드를 노출하지 않는다는 것이 확실합니다. finalize() 메서드는 PSTFile가 가비지 수집 될 때 기본 파일을 닫습니다. 가능한 가장 작은 범위에서 사용하고 가능한 빨리 처리하는 것이 좋지만 그 외에는 수행 할 수있는 작업이 많지 않습니다 (reporting an issue to the project - 또는 제외). 물론, 패치를 직접 보내야합니다.)

편집 1 :

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

편집 2 : 나는 pull request을 만들었습니다
추가

PSTFile이 기본 파일을 반환하는 getFileHandle() 방법을 가지고, 당신은 close() 그 수 있도록 PSTFile.close(). 그것이 어떻게 부는 지 보자.

편집 3 :
내 요청이 병합되었습니다 (Richard Johnson!에게 감사드립니다). 다음 릴리스 (또는 직접 java-libpst를 빌드하는 경우)에서 PSTFileclose()을 직접 호출 할 수 있습니다.

1

PSTFilefinalize 메서드에서 파일 핸들을 닫음으로써 PSTFile가 가비지 수집 될 때 파일이 닫힙니다. finalize이 훨씬 늦게 호출되거나 결코 호출되지 않을 수도 있기 때문에이 방법으로 리소스를 정리하는 것이 좋은 스타일이라고 생각하지 않습니다.

+0

PST 파일을 읽을 수있는 응용 프로그램이 있습니다. 응용 프로그램이 다른 응용 프로그램에서 액세스하는 pst 파일을 읽을 수 없습니다. 위 코드를 사용하면 응용 프로그램이 pst 파일을 읽을 수 없습니다. 응용 프로그램을 다시 시작한 후 응용 프로그램을 읽을 수 있습니다. –

+0

아마도 파일이 아직 닫혀 있지 않기 때문일 수 있습니다. 응용 프로그램을 종료하면 파일 핸들이 닫힙니다. Mureinik과 Adrian B.이 지적했듯이, 저는 현재의 상태에서 도서관을 사용하지 않을 것입니다. 아마도 PSTFile은 AutoCloseable을 구현할 수 있습니다. – Drunix

1

@RC와 마찬가지로 라이브러리는 닫기 메서드를 노출하지 않습니다. 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()도 실행되지 않습니다. 왜 그물에 많은 기사 중 하나를 참조하십시오 : http://howtodoinjava.com/2012/10/31/why-not-to-use-finalize-method-in-java/.

내 조언은 더 많은 "검증 된"라이브러리를 사용하거나 가능하지 않은 경우 해당 파일을 변경하여 명시적인 닫기 메소드를 노출하고 다시 빌드하는 것입니다.