web-dev-qa-db-ja.com

Javaプロパティファイルで配列を表現するより良い方法

現在、ロードして配列に変換する必要がある.propertiesファイルを作成しています。ただし、各プロパティキーが0〜25の範囲に存在する可能性があります。私はいくつかの実装を試みましたが、私はこれをきれいに行うことにこだわっています。誰にもアイデアはありますか?

foo.1.filename=foo.txt
foo.1.expire=200

foo.2.filename=foo2.txt
foo.2.expire=10

etc more foo's

bar.1.filename=bar.txt
bar.1.expire=100

ここで、ファイル名/有効期限のペアを、foo[myobject]

プロパティファイルのフォーマットは変更される可能性があります。私はアイデアを受け入れています。

47
yep

潜在的な値ではない区切り文字を定義するか、XMLの使用方法を学習してください。

それでもプロパティの使用を主張する場合は、すべてのキーのリストを返すメソッドのいずれかを使用します。キーには、グループ識別子(foo、bar)、インデックス(1、2)、および要素名(filename、expire)の3つの部分があります。すべてのキーを取得して、それらをコンポーネント部分に分割します。リストを処理するとき、識別子のタイプごとにリストを作成し、識別子を使用して追加するリストを決定します。あなたが言ったようにペアの要素を作成し、リストに追加するだけです!インデックスの順序が重要な場合は、ペアの要素にフィールドとして追加するか、処理する前にキーを並べ替えます。

12
BigMac66

区切り文字の使用と

String.split(delimiter)

プロパティファイルの例:

MON = 0800#Something#Something1、Something2

prop.load(new FileInputStream("\\\\Myseccretnetwork\\Project\\props.properties"));
String[]values = prop.get("MON").toString().split("#");

役立つことを願っています

35
Abs

あなたの意図を正確に理解できませんでした。 Apache Commons設定ライブラリを確認してください http://commons.Apache.org/configuration/

Key = value1、value2のように、キーに対して複数の値を持つことができ、これをconfiguration.getAsStringArray("key")として配列に読み込むことができます

12
Venu K

Apache Commons(http://commons.Apache.org/configuration/)を使用することを強くお勧めします。 XMLファイルを構成ファイルとして使用する機能があります。 XML構造を使用すると、特別に番号付けされたプロパティではなく、値のリストとして配列を簡単に表すことができます。

4
Jack Cox

カスタム読み込みがあります。プロパティは次のように定義する必要があります。

key.0=value0
key.1=value1
...

カスタム読み込み:

/** Return array from properties file. Array must be defined as "key.0=value0", "key.1=value1", ... */
public List<String> getSystemStringProperties(String key) {

    // result list
    List<String> result = new LinkedList<>();

    // defining variable for assignment in loop condition part
    String value;

    // next value loading defined in condition part
    for(int i = 0; (value = YOUR_PROPERTY_OBJECT.getProperty(key + "." + i)) != null; i++) {
        result.add(value);
    }

    // return
    return result;
}
3
somtomas

プロパティに[〜#〜] yaml [〜#〜]ファイルを使用します。これはプロパティを配列としてサポートします。

YAMLの概要:

JSONのスーパーセットで、JSONができることすべてを実行できます。

  1. 読みやすい
  2. 複数行の値への長いプロパティ
  3. コメントをサポート
  4. 配列としてのプロパティ
  5. YAML検証
3
Sangeeth

メカニズムを実装する別の方法を次に示します。ここでは、配列は0で始まり、インデックス間に穴がないことを考慮します。

    /**
     * get a string property's value
     * @param propKey property key
     * @param defaultValue default value if the property is not found
     * @return value
     */
    public static String getSystemStringProperty(String propKey,
            String defaultValue) {
        String strProp = System.getProperty(propKey);
        if (strProp == null) {
            strProp = defaultValue;
        }
        return strProp;
    }

    /**
     * internal recursive method to get string properties (array)
     * @param curResult current result
     * @param paramName property key prefix
     * @param i current indice
     * @return array of property's values
     */
    private static List<String> getSystemStringProperties(List<String> curResult, String paramName, int i) {
        String paramIValue = getSystemStringProperty(paramName + "." + String.valueOf(i), null);
        if (paramIValue == null) {
            return curResult;
        }
        curResult.add(paramIValue);
        return getSystemStringProperties(curResult, paramName, i+1);
    }

    /**
     * get the values from a property key prefix
     * @param paramName property key prefix
     * @return string array of values
     */
    public static String[] getSystemStringProperties(
            String paramName) {
        List<String> stringProperties = getSystemStringProperties(new ArrayList<String>(), paramName, 0);
        return stringProperties.toArray(new String[stringProperties.size()]);
    }

テストする方法は次のとおりです。

    @Test
    public void should_be_able_to_get_array_of_properties() {
        System.setProperty("my.parameter.0", "ooO");
        System.setProperty("my.parameter.1", "oO");
        System.setProperty("my.parameter.2", "boo");
        // WHEN 
        String[] pluginParams = PropertiesHelper.getSystemStringProperties("my.parameter");

        // THEN
        assertThat(pluginParams).isNotNull();
        assertThat(pluginParams).containsExactly("ooO","oO","boo");
        System.out.println(pluginParams[0].toString());
    }

お役に立てれば

すべての発言は大歓迎です。

1
boly38

ユーザー 'Skip Head'が既に指摘しているように、csvまたは任意のテーブルファイル形式があなたの場合により適しています。

それがあなたのためのオプションであるなら、多分これ Table 実装はあなたに興味があるかもしれません。

0
Omnaest