2010-01-05 5 views
50

기본 클래스 인 java.util.Properties 개체를 허용하려고하는 기본 속성을 사용하고 다른 java.util.Properties 개체를 지정하여 개발자가 일부 개체를 재정의하도록하겠습니다. 그러나이를 수행하는 좋은 방법을 찾을 수 없습니다.두 개의 java.util.Properties 객체를 병합하는 방법은 무엇입니까?

Properties defaultProperties = new Properties(); 
defaultProperties.put("key1", "value1"); 
defaultProperties.put("key2", "value2"); 

Properties otherProperties = new Properties(); 
otherProperties.put("key2", "value3"); 

Properties finalProperties = new Properties(defaultProperties); 

// 
// I'd expect to have something like: 
// 
// finalProperties.merge(otherProperties); 
// 
+0

누군가 답장을했지만 정확한 답은 올바른 대답이고 원하는 결과를 얻은'putAll()'메서드를 사용하는 올바른 방법이라고 답했다. 나는'java.util.Properties'가'java.util.Hashtable'을 확장한다는 것을 알지 못했습니다. – Igor

+0

내 대답이 정확하지 않은 이유는 무엇이라고 생각하십니까? – Jerome

+1

기술적으로 잘못된 것은 아니지만, 원하는 내용은 내용을 반복하지 않고 두 개의 java.util.Properties 파일을 병합하는 것이 었으며 정확히 putAll() 메소드가 수행하는 것입니다. – Igor

답변

111

java.util.Propertiesjava.util.Map 인터페이스를 구현하고, 그래서 당신은 바로 그러한로 취급 할 수 있으며, putAll 같은 사용 방법은 다른 Map의 내용을 추가 할 수 있습니다. 당신이지도처럼 취급 경우

그러나,이 매우 조심해야합니다

new Properties(defaultProperties); 

를 '그 은 복사 생성자와 같은 보이기 때문에 이것은 종종 사람들을 잡는다, 그러나 그것은 외설 티. 그 생성자를 사용하고 (Hashtable 수퍼 클래스에서 상속)과 같은 것을 호출하면 PropertiesMap 메서드는 생성자에 전달 된 기본값 인 Properties 개체를 고려하지 않으므로 빈 집합을 가져옵니다. 기본값은 Properties 자체에 정의 된 방법 (예 : getPropertypropertyNames)을 사용하는 경우에만 인식됩니다.

Properties merged = new Properties(); 
merged.putAll(properties1); 
merged.putAll(properties2); 

이 당신에게 더 많은 예측 결과, 오히려 임의로 "기본"속성 세트로 그들 중 하나를 라벨에 비해 줄 것이다 :

그래서 당신이 개체를 두 개의 속성을 병합해야하는 경우,이 작업을 수행하는 것이 안전하다 . 그 때문에

일반적으로, 나는 (- 즉, 게으른 디자인했다 속성을 확장하지하는 Hashtable 포함해야) 자바의 초기부터 (제 생각에)하는 MapProperties을 치료하지 구현 실수를 추천 할 것입니다 그러나 Properties 자체에 정의 된 빈혈 인터페이스는 많은 옵션을 제공하지 않습니다.

Properties properties = new Properties(); 
properties.load(getClass().getResourceAsStream("default.properties")); 
properties.load(getClass().getResourceAsStream("custom.properties")); 
+2

좋아, 나는 당신이 묘사 한 것을 정확히 쓰려고했다. 너 나 버그를 구해 줬어. – Igor

+2

Properties를 Map으로 보는 또 다른 위험은 "Genericified"가 아니라는 것입니다 :'properties.put ("key", new Object())'가 컴파일됩니다. – Jerome

+1

'get()'을 사용하여 다시 컴파일하고 getProperty()를 사용하여 다시 가져 오지 않으면 컴파일 될 수 있습니다. – skaffman

4

당신은 거의 좋은 것 :

Properties defaultProperties = new Properties(); 
defaultProperties.setProperty("key1", "value1"); 
defaultProperties.setProperty("key2", "value2"); 

Properties finalProperties = new Properties(defaultProperties); 
finalProperties.setProperty("key2", "value3"); 

편집 :setProperty으로 put을 대체

의도 된 사용법은 다음과 같다.

1

네가 바로 putAll 메소드를 호출하면 끝난 것입니다.

+0

CW는 충돌을 피하기 위해 이것이 내가 대답하려고했던 대답이라고 생각했다. – OscarRyz

18

나도 같은 속성에서 두 파일을로드 가고 싶어, 당신은 결국 파일에서 속성을 읽을하고자하는 가정은 같은 객체 복사 모든 매핑에서을 지정된 맵을이 해시 테이블에 맵한다 이러한 매핑은이 해시 테이블이 현재 지정된지도에있는 키 중 하나에 대해 갖는 모든 매핑을 대체합니다.

Properties merged = new Properties(); 
merged.putAll(properties1); 
merged.putAll(properties2); 

라인 2는 전혀 영향을 미치지 않습니다. 첫 번째 파일의 모든 속성이 병합 된 속성 개체에 없습니다.

1

putAll에() :

+1

** 마지막 행은 완전히 사실이 아닙니다 **. properties2에없는 property1의 모든 등록 정보는 병합 된 등록 정보 1의 값으로 설정됩니다. –

관련 문제