CharsetResourceBundleControl

ユーティリティ系メソッドのネタが尽きたので、今回からはユーティリティ系クラス。
できるだけ単体で使用できる形で書いていく。

javaコアAPIで使用する一般的な設定ファイルはpropertiesという拡張子で作成する。
読み込む時にはResourceBundleというクラスを使用するが、こいつは基本的にasciiコードしか認識しない。
日本語などを含める場合はいちいち\uXXXなんて形にエスケープする必要がある。
まあeclipseであれば自動的に変換してくれるが、本番環境で変更する場合を考えると直接日本語で書きたい。
てなわけで、文字コードを指定してpropertiesファイルを読み込むためのクラス。
作った当時は一通り動作確認はしているはずだが、最近はほとんどさわっていないのでちと自信がない。
ちゃんと動くのかな〜

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URLConnection;
import java.nio.charset.Charset;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;

public class CharsetResourceBundleControl extends ResourceBundle.Control {

    private Charset charset = Charset.defaultCharset();

    public CharsetResourceBundleControl(Charset charset) {
        this.charset = charset;
    }

    @Override
    public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException {
        String bundleName = toBundleName(baseName, locale);
        if (format.equals("java.class")) {
            return super.newBundle(bundleName, locale, format, loader, reload);
        }
        if (format.equals("java.properties")) {
            bundleName = toResourceName(bundleName, "properties");
            InputStream stream = null;
            if (reload) {
                URLConnection con = null;
                con = loader.getResource(bundleName).openConnection();
                con.setUseCaches(false);
                stream = con.getInputStream();
            } else {
                stream = loader.getResourceAsStream(bundleName);
            }
            Reader reader = new InputStreamReader(stream, charset);
            return new PropertyResourceBundle(reader);
        }
        return super.newBundle(bundleName, locale, format, loader, reload);
    }

}