2011-03-25 78 views
2

我知道兩種方法來讀取.properties文件:在java中讀取屬性文件的最佳方法?

1- System.getProperties.load(.properties文件的InputStream); 2-創建一個新的Properties對象,然後調用load(InputStream爲.properties文件);

在第一種方法中,我們是否要將.properties文件的值存儲在System對象中。它利用更多資源嗎?

想知道哪種方法可以做到這一點,或者除了上述兩種方式之外,如果還有其他最好的方法,請讓我知道。

謝謝。

回答

9

取決於屬性文件所代表的內容。如果它表示需要覆蓋/提供某些默認系統屬性的系統屬性,則請轉到第一種方法。但是如果它代表特定於應用程序的屬性(更常見的情況是這種情況),那麼就採用第二種方法。

+0

完全同意。系統屬性顯然與系統有關,並且與應用程序有關的任何內容。後者被概括爲應用程序配置,它與Apache配置項目http://commons.apache.org/configuration/howto_properties.html相似。其他類型的屬性或ResourceBundle加載是用於國際化的,這仍然與後者有關。 – hisdrewness 2011-03-25 04:56:58

0

IMO,將應用程序屬性加載到系統屬性對象是一個壞主意。如果有人將僞造的屬性值放入正在加載的文件中,這可能會導致各種模糊的失敗。例如,將「java.home」設置爲假值將導致JavaMail失敗,並且設置其中一個「* .separator」屬性可能導致各種各樣的行爲出現異常。

如果你的應用程序確實需要「覆蓋」系統屬性,那麼這將是更好地做到這一點:

Properties props = new Properties(System.getProperties()); 
    props.load(someInputStream); 

如果沒有,則只需加載屬性如下:

Properties props = new Properties(); 
    props.load(someInputStream); 

如果由於某種原因,您需要覆蓋系統屬性對象本身的值,那麼您應該更仔細/有選擇性地做到這一點。

0

我們會閱讀使用URL屬性文件...

Properties props = new Properties(); 
try 
{ 
    java.net.URL url = Thread.currentThread().getContextClassLoader().getResource(fileName); 
    java.net.URL url2 = ClassLoader.getSystemResource(fileName); 
    props.load(url.openStream()); 
} 
catch (FileNotFoundException e) 
{ 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
catch (IOException e) 
{ 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
return props; 
相關問題