Font.createFont оставляет файлы во временном каталоге - PullRequest
8 голосов
/ 17 ноября 2009

Приведенный ниже код работает, но оставляет копии файла шрифта во временном каталоге при каждом запуске. Эти файлы называются + ~ JF7154903081130224445.tmp , где число кажется случайным для каждого созданного файла.

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

Я нашел давние обсуждения на форумах sun.com и других ресурсах в Интернете, где это считается ошибкой в ​​JDK, где обновление с 1.5.0_06 до 1.5.0_08 решило бы проблему; однако я использую более позднюю версию (1.6.0_13).

Я попытался решить проблему, удалив файлы после завершения операций со шрифтами, но в это время файлы заблокированы. Файлы могут быть удалены только после остановки веб-приложения.

У кого-нибудь есть решение этого вопроса?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2009

Если ваши ttf-файлы не находятся внутри архива, вы можете вызвать createFont (File) вместо createFont (InputStream)

Насколько я знаю, эта ошибка существует в Java 6, достаточно взглянуть на источники класса Font.

1 голос
/ 18 ноября 2009

В JDK1.6.0_16 менеджер шрифтов, похоже, использует временный файл как своего рода кеш и будет читать глифы из шрифта только тогда, когда они необходимы. Это также добавляет ловушку завершения работы, которая удалит файл, когда JVM обычно завершается. В зависимости от виртуальной машины, рендеринг шрифтов, возможно, также делегируется нативному коду, который нуждается в доступе к файлу, поэтому сохранение блокировки файла мне кажется разумным.

Сохраняются ли файлы на самом деле, даже если ваш контейнер сервлетов (вы упоминаете веб-приложение) регулярно завершается или вы убиваете его, не позволяя ему правильно очистить свои ресурсы?

...