公司最近向 dubbo + spring +redis 迁移,Font 原来是缓存在静态数组内部的,现在需要向 dubbo 迁移了,Font 需要往redis内缓存,这就遇到问题了,Font 虽然实现了serailize接口但是如果使用第三方 字库,这个Font 序列化后会丢失,也就是说 Font 是不能缓存的。经过研究 Font 内 存储第三方字库的内容位于 Font2DHandle 这个类,这个类是不支持序列化的,且内部只存储了 字库文件的路径,也就是说,这个必须去本地读文件。dubbo 的每一个实例都需要加载一次本地文件。
Font font = Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(Font.PLAIN, 100); //(虽然是流,但是会在本地生成临时文件后再读取本地文件)
GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);
仅仅能用registerFont 在单个实例内注册一次,方便以后使用。
之后仅需
String fontName = font.getFontName();
Font fontRegistered = new Font(fontName, Font.PLAIN, 100);
每次启服务都需要重新加载。
File 对象是不能缓存的,因为File 指的是本地文件协议,仅仅只有本地文件可以,即使是 虚拟文件系统apacheVFS 也无法做到,因为在设计上File 就是指本地文件。本地文件与流最大的区别就是: 流是一次性的,只能向下迭代。