2011-03-25 56 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; 
相关问题