列出 Java 环境可用的所有字体名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.awt.GraphicsEnvironment;
 
public class ListJavaFonts
{
 
  public static void main(String[] args)
  {
    String fonts[] = 
      GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
 
    for ( int i = 0; i < fonts.length; i++ )
    {
      System.out.println(fonts[i]);
    }
  }
 
}

getResource().getPath()返回的路径空格变成了 %20

最近我们有一个 web 程序,为了取到配置文件的路径,采用了
this.getClass().getResource(“/”).getPath()
的方法来取得存放 class 的物理路径。本来测试的时候没问题,一发布崩溃掉了。究其原因是发布环境的 Tomcat 的安装目录带有空格,而 getPath 的返回值把空格给转换成了 “%20”。经过一番调查,原来是这是 Java 的一个历史悠久的 bug:

Bug ID: 4466485 getClass( ).getResource( ).getFile( ) returns file name with %20

此 bug 于 2001年6月被提出来,2002年11月最终关闭。
没有修复的原因是这样做会导致兼容性问题。
官方给出的解决方法是采用URI类再把它解码出来。

    URI uri = new URI(url.toString());
    FileInputStream fis = new FileInputStream(uri.getPath());

而这个bug是当初为了修复另一个 bug 的时候引入的:
Bug ID: 4359123 NoClassDefFoundError if ‘#’ anywhere in path

我们最终决定不用这个拐弯抹角的方法,干脆采用下面几种办法直接取得 Stream。

    ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
    Class.getResourceAsStream ("/some/pkg/resource.properties");
    ResourceBundle.getBundle ("some.pkg.resource");