解决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的次数.也可以解决此类问题.但还是推荐创建对象的方式.

Guess you like

Origin blog.csdn.net/qq_39078783/article/details/131431934