日本語が使えるPropertiesクラス

<移行分>

<追記>
Java6では、util.Properties#load(Reader reader) なんてメソッドが用意されており、

    java.util.Properties jp = new java.util.Properties();
    InputStream in = this.getClass().getClassLoader.getResourceAsStream("path/to/props.properties");
    jp.load(new InputStreamReader(in, "UTF-8"));

UTF-8なpropertiesを読めちゃうのでした。
</追記>


日本語が使えるPropertiesクラス
2008/08/06追記:Java6ではデフォルトで使えました。 => Java6時点でPropertiesは日本語が使えた。JDK5な状況なら有用でしょうか…。

import java.io.InputStream;
import java.io.IOException;
import java.util.Iterator;

public class Properties extends java.util.Properties {
    
    private static final long serialVersionUID = 2322835339505842342L;
    private static final String DEFAULT_CHARSET = "UTF-8";

    public Properties() {
        super.defaults = new java.util.Properties();
    }
    
    public Properties(Properties defaults) {
        super(defaults);
    }
    
    public void load(InputStream in, String charsetName) throws IOException {
        super.load(in);
        if (charsetName == null) { return; }
        for (Iterator i=stringPropertyNames().iterator(); i.hasNext(); ) {
            String origKey = i.next();
            String key = new String(origKey.getBytes("ISO-8859-1"), charsetName);
            if (super.defaults.containsKey(key)) { continue; }                
            String prop = getProperty(origKey);
            setProperty(key, new String(prop.getBytes("ISO-8859-1"), charsetName));
            if (origKey.equals(key) == false) {
                remove(origKey);
            }
        }
    }
    
    @Override
    public void load(InputStream in) throws IOException {
        load(in, DEFAULT_CHARSET);
    }
}

使い方

    @Test
    public void testProperties() throws Exception {
        ClassLoader loader = this.getClass().getClassLoader();
        Properties props = new Properties();
        props.load(loader.getResourceAsStream("examples/applicationcontext/nihongo.properties"), "UTF-8");
        assertEquals("value for the key", props.getProperty("key1"));
        assertEquals("キーに対する値", props.getProperty("キー"));
        
        Properties props1 = new Properties(props);
        props1.load(loader.getResourceAsStream("messages/format.properties"), "ISO-8859-1");
        assertEquals("value for the key", props1.getProperty("key1"));
        assertEquals("キーに対する値", props1.getProperty("キー"));
        assertEquals("alligator's rock!", props1.getProperty("message"));

        Properties props2 = new Properties();
        props2.load(loader.getResourceAsStream("messages/format.properties"));
        assertEquals("alligator's rock!", props2.getProperty("message"));

        Properties props3 = new Properties();
        props3.load(loader.getResourceAsStream("examples/applicationcontext/nihongo.properties"));
        assertEquals("value for the key", props3.getProperty("key1"));
        assertEquals("キーに対する値", props3.getProperty("キー"));
    }

クラス名だけ要修正。