2009-11-17 5 views
7

아래 코드는 작동하지만 매번 실행될 때마다 임시 디렉토리에 글꼴 파일의 복사본을 남겨 둡니다. 이 파일들의 이름은 + ~ JF7154903081130224445.tmp이며, 생성 된 파일마다 숫자가 임의로 표시됩니다.Font.createFont 임시 디렉토리에 파일을 남깁니다.

InputStream fontStream = this.getClass().getResourceAsStream("handsean.ttf"); 
Font baseFont = Font.createFont(Font.TRUETYPE_FONT, fontStream); 
fontStream.close(); 

나는이가 1.5.0_08로 1.5.0_06에서 업그레이드하면 문제를 해결할 것 JDK, 버그로 인식되고 웹에 sun.com에서 포럼에서 살 토론 및 기타 리소스를 발견했다 ; 그러나 사용중인 버전은 이후 버전 (1.6.0_13)입니다.

글꼴 관련 작업이 끝난 후 파일을 삭제하여 문제를 해결하려고했지만 그 당시 파일이 잠겼습니다. 파일은 웹 응용 프로그램이 중지 된 후에 만 ​​삭제할 수 있습니다.

누구에게도 해결책이 있습니까?

답변

1

, 당신의 createFont (의 InputStream) 본인이 아는으로

는,이 버그는 자바 6에 존재, 그것은에 충분 대신의 createFont (파일)를 호출 할 수 있습니다 Font 클래스의 소스를 살펴 보자.

+0

임시 파일을 사용하지 않으므로 createFont (File)를 사용하여 소스를 살펴 보는 것이 좋습니다. 그것을 시도하고 알려 드리겠습니다. –

+0

임시 파일이 전혀 생성되지 않도록하는 createFont (File)를 호출하도록 코드를 수정했습니다. –

1

JDK1.6.0_16에서는 글꼴 관리자가 임시 파일을 일종의 캐시로 사용하고있는 것처럼 보입니다. 글꼴 관리자는 임시 파일을 필요할 때만 글꼴에서 읽을 수 있습니다. 또한 JVM이 정상적으로 종료 될 때 파일을 삭제하는 종료 훅을 추가합니다. VM에 따라 글꼴 렌더링이 파일에 대한 액세스가 필요한 원시 코드로 위임되어 파일에 대한 잠금을 유지하는 것이 나에게 맞는 것처럼 보입니다.

웹 응용 프로그램을 언급하는 서블릿 컨테이너가 정기적으로 종료되거나 리소스를 올바르게 정리하지 않고 종료하는 경우에도 파일이 실제로 보관됩니까? 당신의 TTF 파일이 아카이브에 있지 않은 경우

+0

예, 파일은 정상 종료 후에도 유지됩니다. –

+0

죄송합니다. 1.6.0_13에서도 문제를 재현 할 수 없습니다. 글꼴 파일은 실제로 보관 및 잠긴 상태이지만 파일을 삭제하기 위해 종료 후크가 사용됩니다. 종료 훅이 실행되는 것을 막기 위해 다른 일을하고 있습니까? 아니면 원격 디버거로 연결할 수 있으며 실제로 sun.font.FontManager.fileCloser 훅이 실제로 실행되지 않는 것을 확인할 수 있습니까? 이론적으로, 2302 행의 delete invokation이 다른 파일이 열려 있으면 (native code?) 조용히 실패 할 수 있습니다. – jarnbjo

+0

문제를 시도하고 재현 할 시간을 내 주셔서 감사합니다. 재현 할 수 없다는 점을 감안하면 내 환경과 관련이있을 수 있습니다. XP에서 실행중인 tomcat에서 개발 중이며 deleteOnExit으로 다른 파일을 표시하는 테스트는 프로세스가 아마 이러한 파일도 보관되므로 정리를 허용하는 방식으로 종료되지 않았 음을 보여줍니다. –