2009-11-17 6 views
7

Il codice riportato di seguito funziona ma lascia copie del file di carattere nella directory temporanea ogni volta che viene eseguito. Questi file si chiamano + ~ JF7154903081130224445.tmp dove il numero sembra casuale per ogni file creato.Font.createFont lascia i file nella directory temporanea

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

ho trovato anni di età discussioni in forum a sun.com e altre risorse sul web dove questo è riconosciuto come un bug nel JDK, dove l'aggiornamento da 1.5.0_06 a 1.5.0_08 avrebbe risolto il problema ; tuttavia, la versione che sto usando è una versione successiva (1.6.0_13).

Ho provato a risolvere il problema eliminando i file dopo che le operazioni relative al carattere sono terminate, ma i file sono bloccati in quel momento. I file possono essere cancellati solo dopo l'arresto dell'applicazione web.

Qualcuno ha una soluzione a questo?

risposta

1

Se i file TTF non sono all'interno di un archivio, è possibile chiamare CreateFont (File) invece di CreateFont (InputStream)

Come al meglio della mia conoscenza, esiste questo bug in Java 6, è sufficiente guarda le fonti della classe Font.

+0

Un buon suggerimento per dare un'occhiata alle fonti, usando createFont (File) sembra promettente, dato che non usa un file temporaneo. Proverò e ti farò sapere. –

+0

Ho modificato il codice per chiamare createFont (File) che ha impedito la creazione di file temporanei. –

1

Con JDK1.6.0_16, il gestore di caratteri sembra utilizzare il file temporaneo come una sorta di cache e leggerà solo glifi dal carattere quando sono richiesti. Aggiunge anche un hook di shutdown, che cancellerà il file quando la JVM termina normalmente. A seconda della VM, il rendering dei font è forse anche delegato al codice nativo che ha bisogno di accedere al file, quindi mantenere un blocco sul file mi sembra ragionevole.

I file vengono effettivamente mantenuti, anche se il contenitore del servlet (si sta citando un'applicazione Web) termina regolarmente o lo si sta uccidendo senza consentirgli di pulire correttamente le risorse?

+0

Sì, i file vengono mantenuti anche dopo la normale interruzione. –

+0

Mi dispiace, ma non riesco neanche a riprodurre il problema con 1.6.0_13. I file dei font sono infatti mantenuti e bloccati, ma un hook di shutdown viene utilizzato per eliminare il file. Stai facendo qualcos'altro per impedire l'esecuzione di hook di shutdown o puoi collegarti con un debugger remoto e davvero confermare che l'hook sun.font.FontManager.fileCloser non è realmente in esecuzione? In teoria, la chiamata di eliminazione nella riga 2302 può fallire silenziosamente se qualcos'altro tiene aperto il file (codice nativo?). – jarnbjo

+0

Grazie per aver trovato il tempo di provare e riprodurre il mio problema. Tenendo conto che non è possibile riprodurlo, potrebbe essere correlato al mio ambiente. Sto sviluppando su tomcat in esecuzione in XP, e testare con altri file con deleteOnExit mostra che il processo non è probabilmente mai terminato in un modo che permetta la pulizia come anche questi file sono mantenuti. –