解决Java 自定义字体产生大量+~JF***.tmp文件导致硬盘爆满

        某天接到领导电话,说线上的程序无法运行.损失了大量订单.接到电话第一时间打开了随身电脑,第一时间查看了项目日志发现是服务器磁盘满了.先不管那么多找到被占用的磁盘目录,将罪魁祸首删除,恢复系统运行.最后复盘的时候发现竟是因为小小的字体导致的,因此被扣了奖金,还受到了批评.

        通过复盘发现,再项目的临时文件目录中出现了大量的以JF开头的字体临时文件.后来查了大量资料,原来是因为每读取一次字体,系统就会拷贝一个tmp文件.久而久之就将磁盘吃光了.

问题代码:


ClassPathResource fontRes = new ClassPathResource("simhei.ttf");
try (InputStream fontInputStream = fontRes.getInputStream()) {
    Font font = Font.createFont(Font.TRUETYPE_FONT, fontInputStream).deriveFont(20F);
}

Font的createFont方法有两个重载方法,当使用流的方式读取字体文件时,就会发生上述的问题.

public static Font createFont(int fontFormat, InputStream fontStream)

public static Font createFont(int fontFormat, File fontFile)

通过源码可以看到,每次调用createFont都会创建一个临时文件

 解决方案: 使用 public static Font createFont(int fontFormat, File fontFile) 即可完美解决该问题

String FONT_PATH = "/simhei.ttf";
Font font = Font.createFont(Font.TRUETYPE_FONT, new File(FONT_PATH)).deriveFont(20F);

总结:由上面了解到,使用流时每调用一次createFont就会创建一个临时文件.因此也可以将font对象作为静态成员变量.再静态代码块里将其初始化.复用Font对象以此来减少调用createFont的次数.也可以解决此类问题.但还是推荐创建对象的方式.

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲸渔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值