2012-04-16 40 views
15

読み込んだプロパティをJavaでスタックすることはできますか?たとえば、私はどうすればいいですか?複数のプロパティファイルを読み込む

Properties properties = new Properties(); 

properties.load(new FileInputStream("file1.properties")); 
properties.load(new FileInputStream("file2.properties")); 

と両方からのアクセスプロパティ?

+1

はい、プロパティの名前が異なる場合はあります。いいえ、プロパティの名前が同じ場合プロパティ名が衝突する場合は、スタックを自分で提供する必要があります。 – Jesse

答えて

28

あなたはこれを行うことができます。

Properties properties = new Properties(); 

properties.load(new FileInputStream("file1.properties")); 

Properties properties2 = new Properties(); 
properties2.load(new FileInputStream("file2.properties")); 

properties.putAll(properties2); 
+5

file2.propertiesに、file1.propertiesで定義されたプロパティと同じ名前のプロパティが含まれている場合、file2.properties内のそれらのプロパティの値のみが存在します。 – Jesse

+0

右。キーは一意でなければならないため、一度に両方のプロパティを保持することはできません。 –

+0

コンストラクタでデフォルトプロパティファイルを渡すことをお勧めします。 PropertiesがMapを拡張することは、単なる実装の詳細です。 – Puce

8

はいプロパティは、スタック。 PropertiesHashtableload()はそれぞれのキーと値のペアでput()を呼び出します。 Sourceから

関連するコード:つまり

String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf); 
String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, convtBuf); 
put(key, value); 

、ファイルから読み込むには、現在のエントリをクリアしません。ただし、2つのファイルに同じキーのエントリが含まれている場合は、最初のファイルが上書きされます。

+0

コンストラクタでデフォルトプロパティファイルを渡すことをお勧めします。 PropertiesがMapを拡張することは、単なる実装の詳細です。 – Puce

+1

この動作は 'Properties'契約では宣言されていません(言い換えれば、これは文書化されていない機能を使用した可能性のあるすべての結果では説明されていません)。 –

+0

これは真実であり、考慮する必要があります。私は単に文書化された行動ではなく、実際の結果に興味を持っていました。 – tskuzzy

3

実際、はいです。あなたはこれを行うことができます。いずれかのプロパティが重複している場合は、新しいプロパティがロードされます。

2

はい、コンストラクタでデフォルトのプロパティファイルを渡す必要があります。このように、あなたはそれらを連鎖させることができます。

例えば:

Properties properties1 = new Properties(); 
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file1.properties"))){ 
    properties1.load(bis); 
} 

Properties properties2 = new Properties(properties1); 
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file2.properties"))){ 
    properties2.load(bis); 
} 
+0

私はこれを最初に気に入ったが、今は予約がある。 BufferedInputStreamを別に置くと、これはOPのコードよりもどのように優れていますか?どちらの場合も、最初のファイルのプロパティを含むPropertiesオブジェクトに直接2番目のファイルをロードしています。しかし、この例では、新しいプロパティオブジェクトを作成しています。どのようなメリットがありますか? – datguy

+0

このメソッドを使用して何らかの理由でプロパティを反復処理している場合は、**反復処理するリストを取得するために** propertyNames()またはstringPropertyNames()を使用する必要があります。 'entrySet()'や 'keySet()'のような基本的な 'Map'メソッドを使うと、コンストラクタで指定されたプロパティはインクルードされません。 –

1

これも動作するはずです。 file1.propertiesとfile2.propertiesで同じプロパティが定義されている場合、file2.propertiesのプロパティが有効になります。

Properties properties = new Properties(); 
    properties.load(new FileInputStream("file1.properties")); 
    properties.load(new FileInputStream("file2.properties")); 

ここで、プロパティマップには両方のファイルのプロパティがあります。 file1とfile2に同じキーが現れている場合、file1からkey2の値がfile2の値で更新されます。

1

不確実な数のファイルで作業することで、これを少しでもダイナミックに行うことができます。

このメソッドのパラメータは、プロパティファイルへのパスを含むリストである必要があります。メソッドを静的にし、他のメッセージ処理関連の関数をクラスに追加し、必要なときに呼び出すだけです。

public static Properties loadPropertiesFiles(LinkedList<String> files) { 
    try { 
     Properties properties = new Properties(); 

       for(String f:files) { 
        Resource resource = new ClassPathResource(f); 
        Properties tempProp = PropertiesLoaderUtils.loadProperties(resource); 
        properties.putAll(tempProp); 
       } 
       return properties; 
    } 
    catch(IOException ioe) { 
       return new Properties(); 
    } 
} 
関連する問題