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); } }