有個需求要用美術字體在圖片上寫字
用自定義的文字有兩個方法:
1、
Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, InputStream input);
2、
Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, new File(pathString));
我一開始用的是第一種方法:
InputStream input = FontLoader.class.getResourceAsStream(classPathTTF); Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, input); input.close();
然后就出現了吃硬盤的問題。
它會在你的容器的臨時文件哪里寫很多的臨時文件
你用一次他就讀一次,拷貝一份 *.tmp文件出來
對於tmp文件的描述google上有很多資料,但是也沒有點到要點。
問題參考資料:
sun關於tmp文件的描述
http://www.securiteam.com/windowsntfocus/5UP0H0KDFU.html
http://stackoverflow.com/questions/1751673/font-createfont-leaves-files-in-temp-directory
[#4743] - Too many temporary font files (+~JF tmp)
http://community.jaspersoft.com/jasperreports-library/issues/4743
有各種的說法:有人說是bug,有些人說升級到有些版本不會有問題,有些人說是操作系統的緣故等。
還有人的解決方案是定時跑任務,刪除tmp文件。這個方式非常不妥當。
以下就是一個用input方式引入自定義font的方式,下面參考資料有坑。
http://www.java2s.com/Code/Java/2D-Graphics-GUI/Loadfontfromttffile.htm
其實問題很簡單,只要替換成第2個方法就可以了。
String pathString = FontLoader.class.getResource("/font/xxx.ttf").getFile(); Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, new File(pathString));
這樣無論多少次飲用都不會有tmp文件產生
總結一下
方法1、消耗IO,吃硬盤,速度慢,生成很多tmp的文件,大硬盤沒感覺,吃光了你就叫吧。
方法2、低IO,速度快,不會生成tmp文件,沒有input流,不必關系是否關系。
做項目的一個坑,自己做個筆記