- PR -

プロパティファイルから、String配列の値を取り込むには?

投稿者投稿内容
なお
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-04-16 16:26
いつもお世話になっております。
ハナと申します。

ResourceBundleに関してお聞きしたい事があります。

以下のように、「test.properties」というファイルを用意し、
「test1」というkeyから、数個のvalue値をString配列で取得したいのですが、
ClassCastExceptionが発生します。

「.propertiesファイル」からは、
getString()を用いてStringの値を取り込む事しか出来ず、
getStringArray()を用いてStringの配列を取り込む事は出来ないのでしょうか?

もし出来ないとするなら、1つのkeyで複数のvalue値を取り込み、
しかも、propertiesファイルのように、外部に値を持ちたい場合、
皆様はどういう方法を用いているのでしょうか?
(ご自分で実装されるのでしょうか?)

ご教授願えたらと思います。

以上、宜しくお願い致します。

--- test.properties ----
test1=A,B,C
------------------------

--- test.classの一部 --------------------------------------
ResourceBundle resource = ResourceBundle.getBundle("test");
String[] str = resource.getStringArray("test1");
-----------------------------------------------------------
ニシトミ
ベテラン
会議室デビュー日: 2003/04/24
投稿数: 76
お住まい・勤務地: 千葉・東京
投稿日時: 2004-04-16 16:53
なんだか久々の書き込み

ハナさん
StringTokenizerを調べてみてください
ニシトミ
ベテラン
会議室デビュー日: 2003/04/24
投稿数: 76
お住まい・勤務地: 千葉・東京
投稿日時: 2004-04-16 16:53
連打してしまいました(汗)

##編集##

[ メッセージ編集済み 編集者: ニシトミ 編集日時 2004-04-16 16:54 ]
sauce
常連さん
会議室デビュー日: 2003/11/12
投稿数: 24
投稿日時: 2004-04-16 16:58
Commons Collections の

org.apache.commons.collections.ExtendedProperties#getStringArray()

を使えばカンマ区切りで配列になりますよ
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-04-16 17:24
JDK1.4からならStringクラスのsplitメソッドで
getString().split(",")とすれば、
そうでないならStringのsplitぐらい簡単に作れるから
同様にgetString()してからsplit掛けたらどうですか?
ニシトミ
ベテラン
会議室デビュー日: 2003/04/24
投稿数: 76
お住まい・勤務地: 千葉・東京
投稿日時: 2004-04-17 00:04
引用:

ハナさんの書き込み (2004-04-16 16:26) より:
getString()を用いてStringの値を取り込む事しか出来ず、
getStringArray()を用いてStringの配列を取り込む事は出来ないのでしょうか?



すごく気になったので、少し調べてみました。
theserverside.com
こういう風に使うみたいです

srcも見てみたんですが
コード:

public final String[] getStringArray(String key) {
return (String[]) getObject(key);
}


な感じになってました
これってなんでpublicなのでしょうか?
へんな事言ってたらすみません!


[ メッセージ編集済み 編集者: ニシトミ 編集日時 2004-04-17 00:12 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2004-04-17 11:55
ResourceBundle#getXXXX()を呼び出すと、めぐりめぐって、ResourceBundle#handleGetObject()が呼ばれます。このメソッドは、各々の具象クラスで実装されます。

j2sdk 1.5βの場合、ResourceBundle#getResource()の呼び出しで、PropertyResourceBundleのインスタンスが返されます。

そこで、、PropertyResourceBundle#handleGetObject()の実装を見ると、
引用:
コード:
    /**
     * Creates a property resource bundle.
     * @param stream property file to read from.
     */
    public PropertyResourceBundle (InputStream stream) throws IOException {
        Properties properties = new Properties();
        properties.load(stream);
        lookup = new HashMap(properties);
    }

    // Implements java.util.ResourceBundle.handleGetObject; inherits javadoc specification.
    public Object handleGetObject(String key) {
        if (key == null) {
            throw new NullPointerException();
        }
        return lookup.get(key);
    }



となっており、Propertiesオブジェクトを介して作成されたHashMapから値を読みこんでいることが分かります。

では、Properties#load()はどうなっているかといえば、
引用:
コード:
public synchronized void load(InputStream inStream) throws IOException {
    // 省略
    String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf);
    String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, convtBuf);
    put(key, value);
}



文字列のキーに対して、文字列の値を入れています。
したがって、ResourceBundleの現在の実装では、文字列しか取り出すことができません。
プロパティファイルから、String配列の値を取り込む方法は、他の方々が回答されているように、文字列で受け取り、自分で分解することが一番現実的だと思います。

どうしても、ResourceBundle#getStringArray()の呼び出しで、文字列の配列を取得したいのであれば、ResourceBundleの派生クラスを作り、handleGetObject()でカンマ区切りの場合は、文字列の配列を返すように実装することになるでしょう。

ハナさんは開発環境のバージョンが記載されていないので、確実とはいえないですが、多分同じ原因だと思います。
# 1.5βでも同様に、ClassCastExceptionが送出されるから。

ニシトミ
ベテラン
会議室デビュー日: 2003/04/24
投稿数: 76
お住まい・勤務地: 千葉・東京
投稿日時: 2004-04-18 01:42
ニシトミです

引用:

かずくんさんの書き込み (2004-04-17 11:55) より:
どうしても、ResourceBundle#getStringArray()の呼び出しで、文字列の配列を取得したいのであれば、ResourceBundleの派生クラスを作り、handleGetObject()でカンマ区切りの場合は、文字列の配列を返すように実装することになるでしょう。



やっぱりそうなんですよね
便乗質問になってしまいますが

ResourceBundle#getStringArray()って
ClassCast投げるじゃないですかぁ

ResourceBundle#getObject()でgetClass()
やってもStrngしか取れない(当たり前ですが)

親でStringしか取れないのに、String[]返すメソッドを持ってる
こんなのってありですか?って思ったんです。

またへんな事を言ってるかもしれません

もしかしてjavaのバージョンが上がれば
hairetu = {"hoge","hoge1"}
こんな感じで取得できるのかも?


[ メッセージ編集済み 編集者: ニシトミ 編集日時 2004-04-18 01:47 ]

スキルアップ/キャリアアップ(JOB@IT)