java.util.ResourceBundleでXXX.propertiesを読む

ResourceBundleはクラスパスにあるプロパティファイルなどを読むことができる。

しかし注意したいのは、クラスパスにないと読めないということ。
eclipseで開発しているときは問題なく動いたのに、サーバにデプロイするとパスが通ってなくて読めてない!なてこともある。
またJavaの特徴でもある「環境依存しない」というものを崩してしまう可能性も含んでいると思っている。


また、Webサービスなどでこれを使うとサービスの再起動をしないと再取得できない場合があるということ。


googleで"ResourceBundle キャッシュ"と検索すると既に検証しているサイトが見つかると思うが、このクラスはキャッシュするのである。
つまりWebサービスなどのインスタンスが残るサービスの場合、もしプロパティファイルを編集して保存したとしても、その変更がサービスに反映されない!
# Tomcatで作っている場合はrestartが容易だと思っているが、restartするのが大変なパッケージもある。。。



と万能とは言えないものだが、簡単に使えるために小規模のサービスならば使ってみるのもいいかもしれない。


固定の"clashm45.properties"を読むクラスを作ってみた。

このようにStringを返すメソッド、Longを返すメソッド、またパス形式にして返したりすると楽な場合も多い。
# 今回のセパレータには"\\"を使ったが、"/"でももちろんいいはずだ。
##「File.separatorChar使えよ」と言いたい人もいるかも知れないが、まれにそれが面倒なことを起こす場合もある。("まれに"だとは思うが)

package utility;

import java.util.ResourceBundle;

/**
 * プロパティファイルの使用をサポートする.
 */
public class PropertyUtil{

    private static final String propertyFilePath = "clashm45";

    private static ResourceBundle bundle = ResourceBundle.getBundle(propertyFilePath);

    /**
     * String型で返す.
     * @param key
     * @return String
     */
    public static String getString(PropertySet key){
        return getValue(key);
    }

    /**
     * Long型で返す.
     * @param key
     * @return Long
     */
    public static Long getLong(PropertySet key){
        return Long.parseLong(getValue(key));
    }

    /**
     * ディレクトリパス形式で返します.
     * @param key
     * @return String
     */
    public static String getPath(PropertySet key){
        String value = getValue(key);
        if(value.lastIndexOf("\\") != -1){
            return value + "\\";
        }
        return value;
    }

    private static String getValue(PropertySet key){
        return bundle.getString(key.getKey());
    }

}