Шрифт.CreateFont оставляет файлы во временном каталоге
-
20-09-2019 - |
Вопрос
Приведенный ниже код выполняет свою работу, но при каждом запуске оставляет копии файла шрифта во временном каталоге.Эти файлы имеют имена +~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).
Я попытался решить проблему, удалив файлы после завершения операций, связанных со шрифтом, но в это время файлы заблокированы.Файлы могут быть удалены только после остановки веб-приложения.
У кого-нибудь есть решение этой проблемы?
Решение
Если ваши ttf-файлы не находятся внутри архива, вы можете вызвать CreateFont(Файл) вместо CreateFont(входной поток)
Насколько мне известно, эта ошибка существует в Java 6, достаточно взглянуть на исходные тексты класса Font.
Другие советы
С JDK1.6.0_16 менеджер шрифтов, похоже, использует временный файл как своего рода кэш и будет считывать глифы из шрифта только тогда, когда они требуются.Он также добавляет перехват завершения работы, который удалит файл при обычном завершении работы JVM.В зависимости от виртуальной машины рендеринг шрифтов, возможно, также делегируется машинному коду, которому необходим доступ к файлу, поэтому сохранение блокировки файла кажется мне разумным.
Сохраняются ли файлы на самом деле, даже если ваш контейнер сервлетов (вы упоминаете веб-приложение) регулярно завершает работу, или вы уничтожаете его, не позволяя ему должным образом очищать свои ресурсы?