2016-03-10 38 views
1

Property.properties獲取從屬性文件中的所有特性值property.getProperty( 「樣品。*」)在Java

sample.user = 「sampleUser」
sample.age =「sampleAge 「
sample.location = 」sampleLocation「(sample.user」)

我可以prop.getProperty得到一個屬性文件的屬性值「。

我在想,如果下面的情況是可能的:

prop.getProperty("sample.*"); 

結果:
sampleUser
sampleAge
sampleLocation

可有人請建議,如果有什麼辦法讓上述結果來自屬性文件?

一個解決方案是獲取整個屬性文件並遍歷它。 但我的財產檔案很長,我認爲這會導致 性能問題,因爲我需要經常打電話給它。

Anther將使用.xml文件而不是.properties文件。

+2

*「但我的屬性文件很長,我認爲這會導致性能問題,因爲我需要經常調用它。」 *是誰說你需要每次讀取文件?是不是很明顯,你只讀取一次文件,然後從['Properties'](https://docs.oracle.com/javase/8/docs/api/java/util/Properties)中檢索數據。 HTML)實例? – Tom

+1

答案是否定的,XML不是解決方案。你將不得不迭代。 – EJP

+0

@Tom:例如,如果我想查找樣本。*,則需要遍歷所有條目,然後如果我想要sample2。*,然後我需要遍歷所有條目。正確? – Bhavin

回答

2

A Properties對象(一個.properties對象形式的文件)只是一個Hashtable<Object,Object>(和一個Map)。 2016年不適合任何用途,但完全可行。

提取匹配效率並不是特別低,甚至幾000行應該返回一個微不足道的時間(可能只有幾毫秒)。這一切取決於你需要檢查的頻率。如果您只需要它們一次,請緩存結果matchingValues並參考它。

不,你不能這樣做prop.getProperty("sample.*");直接,但代碼是通過Map接口非常簡單:

Properties p = new Properties(); 
p.setProperty("sample.user", "sampleUser"); 
p.setProperty("sample.age", "sampleAge"); 
p.setProperty("sample.location", "sampleLocation"); 

Pattern patt = Pattern.compile("sample.*"); 

final List<String> matchingValues = new ArrayList<>(); 

for (Entry<Object,Object> each : p.entrySet()) { 
    final Matcher m = patt.matcher((String) each.getKey()); 
    if (m.find()) { 
     matchingValues.add((String) each.getValue()); 
    } 
} 

System.out.println(matchingValues); 

上述匹配和建設了0.16的毫秒在我5歲的iMac。

切換到XML表示會更加複雜,而且加載和處理速度肯定會慢一些。

+0

看起來很有前途,我會試試看。謝謝 – Bhavin

+0

如果解決了你的問題,你能接受這個答案嗎?謝謝! –

+0

我試圖接受它,但它說我沒有足夠的聲譽來公開顯示已經接受的反饋 – Bhavin

1

的Java 8它可能看起來像

Properties p = new Properties(); 
... 
List<String> matchingValues = p.entrySet().stream() 
       .filter(e -> e.getKey().toString().matches("sample.*")) 
       .map(e -> e.getValue().toString()) 
       .collect(Collectors.toList()); 

System.out.println(matchingValues); 
+0

不是一種批評,但有趣的是,這個版本需要〜300-400倍的時間才能在我的JDK 1.8.0_51上執行( 〜65 ms vs 0.17 ms) –

+1

@AndrewRegan確定它的速度較慢,因爲'filter'謂詞中有多個正則表達式模式創建。但是,如果你使用例如10行? –

+0

一點也不感興趣。 –