8

下面的代码完成了它的工作,但每次运行时都会在 temp 目录中保留字体文件的副本。这些文件被命名为+~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)。

我尝试通过在字体相关操作完成后删除文件来解决问题,但当时文件被锁定。只有在 Web 应用程序停止后才能删除文件。

有人对此有解决方案吗?

4

2 回答 2

2

如果您的 ttf 文件不在存档中,您可以调用 createFont(File) 而不是 createFont(InputStream)

据我所知,这个 bug 存在于 Java 6 中,看看 Font 类的来源就足够了。

于 2009-11-17T22:04:39.627 回答
1

在 JDK1.6.0_16 中,字体管理器似乎将临时文件用作一种缓存,并且只会在需要时从字体中读取字形。它还添加了一个关闭挂钩,它将在 JVM 正常终止时删除该文件。根据虚拟机的不同,字体渲染可能也委托给需要访问文件的本机代码,因此对我来说保持对文件的锁定似乎是合理的。

即使您的 servlet 容器(您提到的是 Web 应用程序)定期终止,这些文件是否实际保留,或者您是否在不允许它正确清理其资源的情况下杀死它?

于 2009-11-17T21:57:37.700 回答