【问题标题】:Font.createFont leaves files in temp directoryFont.createFont 将文件留在临时目录中
【发布时间】:2010-12-17 14:59:00
【问题描述】:

下面的代码完成了它的工作,但每次运行时都会在临时目录中保留字体文件的副本。这些文件被命名为 +~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 应用程序停止后才能删除文件。

有没有人可以解决这个问题?

【问题讨论】:

    标签: java fonts temporary-files graphics2d


    【解决方案1】:

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

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

    【讨论】:

    • 很好的建议是查看源代码,使用 createFont(File) 看起来很有希望,因为它不使用临时文件。会尝试并让您知道。
    • 我将代码修改为调用 createFont(File),从而完全阻止了临时文件的创建。
    【解决方案2】:

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

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

    【讨论】:

    • 是的,正常终止后文件也会保留。
    • 很抱歉,我也无法在 1.6.0_13 中重现您的问题。字体文件确实被保留并锁定,但使用关闭挂钩删除文件。您是否正在做其他事情来防止运行关闭挂钩,或者您可以附加远程调试器并真正确认 sun.font.FontManager.fileCloser 挂钩确实没有运行?理论上,如果其他东西保持文件打开(本机代码?),第 2302 行中的删除调用可能会静默失败。
    • 感谢您花时间尝试重现我的问题。考虑到您无法重现它,它可能与我的环境有关。我正在在 XP 中运行的 tomcat 上进行开发,并使用 deleteOnExit 标记其他文件进行测试表明该进程可能永远不会以允许清理的方式终止,因为这些文件也被保留。
    猜你喜欢
    • 2010-11-10
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2017-12-22
    • 1970-01-01
    相关资源
    最近更新 更多