java.awt.FontFormatException: java.nio.BufferUnderflowException

发布于:2024-04-03 ⋅ 阅读:(98) ⋅ 点赞:(0)
Font awardFont = Font.createFont(Font.TRUETYPE_FONT, awardFontFile).deriveFont(120f).deriveFont(Font.BOLD);

使用如上语句创建字体时出现问题。java.awt.FontFormatException: java.nio.BufferUnderflowException异常表明在处理字体数据时出现了缓冲区下溢(Buffer Underflow)的情况。这通常发生在尝试读取字体数据时,缓冲区的容量比所需数据少,导致无法从缓冲区中读取足够的字节。可能问题如下:

  • 字体文件损坏:字体文件可能已损坏或不完整,导致字体数据无法完全读取。尝试使用其他字体文件,或者重新下载/获取字体文件。

  • 字体加载方式:检查字体文件的加载方式。您可以尝试使用不同的方式加载字体文件,例如直接从文件系统加载而不是从JAR文件中加载,或者通过URL加载字体文件。

  • 字体格式不兼容:确保字体文件的格式受Java支持。常见的受支持格式包括TrueType (.ttf)和OpenType (.otf)。如果字体文件不是这些格式之一,可能会导致异常。

我的错误均不是这些问题,比较低级。原本是根据文件创建字体,改为输入流后对应代码逻辑没有进行更改,导致某一段代码中,使用同一个流创建了两个字体,这会导致第一个输入流创建完之后遇到了输入流的尾部,导致第二个字体无法被正确创建。

【修改前】

InputStream footSongFontFile = getClass().getResourceAsStream(Constants.FONT_PATH + "SanJiZiHaiSongGBK-2.ttf");
Font footSongFont = Font.createFont(Font.TRUETYPE_FONT, footSongFontFile).deriveFont(60f);
Font _footSongFont = Font.createFont(Font.TRUETYPE_FONT, footSongFontFile).deriveFont(50f);

【修改后】

InputStream footSongFontFile = getClass().getResourceAsStream(Constants.FONT_PATH + "SanJiZiHaiSongGBK-2.ttf");
InputStream _footSongFontFile = getClass().getResourceAsStream(Constants.FONT_PATH + "SanJiZiHaiSongGBK-2.ttf");
Font footSongFont = Font.createFont(Font.TRUETYPE_FONT, footSongFontFile).deriveFont(60f);
Font _footSongFont = Font.createFont(Font.TRUETYPE_FONT, _footSongFontFile).deriveFont(50f);

网站公告

今日签到

点亮在社区的每一天
去签到