你的浏览器不支持canvas

做你害怕做的事情,然后你会发现,不过如此。

Font.createFont产生+~JF.tmp临时文件占满磁盘

时间: 作者: 黄运鑫

本文章属原创文章,未经作者许可,禁止转载,复制,下载,以及用作商业用途。原作者保留所有解释权。


  • 在生成图片水印时,用到了字体文件,代码如下:
    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("/fonts/msyh.ttf");
    Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, inputStream);
    
  • 使用过程中发现磁盘很快就满了,原因是每次执行Font.createFont对象都会生成+~JF.tmp临时文件
  • 查看源码发现Font.createFont(Font.TRUETYPE_FONT, inputStream)调用了java.awt.FontcreateFont0方法,会将字体文件流生成临时文件,源码如下:
    private static Font createFont0(int fontFormat, InputStream fontStream,
                                  CreatedFontTracker tracker)
      throws java.awt.FontFormatException, java.io.IOException {
    
      if (fontFormat != Font.TRUETYPE_FONT &&
          fontFormat != Font.TYPE1_FONT) {
          throw new IllegalArgumentException ("font format not recognized");
      }
      boolean copiedFontData = false;
      try {
          final File tFile = AccessController.doPrivileged(
              new PrivilegedExceptionAction<File>() {
                  public File run() throws IOException {
                      return Files.createTempFile("+~JF", ".tmp").toFile();
                  }
              }
          );
          if (tracker != null) {
              tracker.add(tFile);
          }
          //其他代码略
    }
    
  • 解决办法是改为使用文件的方式获取字体:
    String fontPath = this.getClass().getResource("/fonts/msyh.ttf").getFile();
    Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, new File(fontPath));
    

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。