【发布时间】:2015-08-17 01:51:05
【问题描述】:
我刚刚读到可以使用Properties 类存储键/值对(属性),该类是HashTable 的子类。但是,我还读到您可以使用System.setProperty 直接存储属性。
那么我应该使用哪一个?每个的真正用例是什么?
非常感谢。
【问题讨论】:
标签: java properties-file
我刚刚读到可以使用Properties 类存储键/值对(属性),该类是HashTable 的子类。但是,我还读到您可以使用System.setProperty 直接存储属性。
那么我应该使用哪一个?每个的真正用例是什么?
非常感谢。
【问题讨论】:
标签: java properties-file
据我所知System.setProperty() 使用java.util.Properties 类,因此它们使用相同的支持类。但是,System.setProperties() 使用的属性类是从 VM 中检索的,请查看 documentation for System.getProperties() 以获取有关属性集的更多信息。
您可能需要考虑通过设置系统属性来尝试实现什么,因为它们通常是描述系统版本和路径的运行时变量。
在我见过的所有应用程序中,System.properties 都用作只读列表,如果您想将属性写出某个地方以供系统使用,您最好将其放在数据库表中(如果您要在运行时更改这些选项)并像这样使用它。如果属性文件是一个相对静态的程序选项列表,您可能需要尝试使用属性文件,您需要能够在应用程序的不同实例上有所不同,因此可能用于品牌推广。
Properties 类的主要目的是能够将列表键值列表序列化为流,请参见Properties 类
【讨论】:
property是Java.lang.System类静态成员变量的类型,是java.util.Properties类型。所以,System.setProperty(key) 只是 property 设置方法。 Hashtable是一种存储数据的方式,你也可以把它当成一个数据库。
您应该使用System.setProperty(key) 和System.getProperty(key) 来写入和读取键/值。
import java.io.FileInputStream;
import java.util.Properties;
public class PropertiesTest {
public static void main(String[] args)
throws Exception {
// set up new properties object
// from file "myProperties.txt"
FileInputStream propFile =
new FileInputStream( "myProperties.txt");
Properties p =
new Properties(System.getProperties());
p.load(propFile);
// set the system properties
System.setProperties(p);
// display new properties
System.getProperties().list(System.out);
}
}
【讨论】:
如果您不想修改很多属性,最好使用System.setProperty(key, value),而不是System.setProperties(props) 或System.getProperties().setProperty(key, value) 等替代方法。不同之处在于SecurityManager 处理这些调用的方式。对于System.setProperty(key, value),要求SecurityManager 获得修改单个特定key 的权限。对于System.getProperties() 调用,SecurityManager 被要求获得读/写任何内容的权限。所以有可能安装的SecurityManager只保护了部分属性,所以setProperty(key, value)会成功,但getProperties().setProperty(key, value)会失败。
如果您需要读取特定属性,请始终使用System.getProperty(key) 而不是System.getProperties().getProperty(key)。如果安装SecurityManager 禁用属性写入,但启用属性读取,则第二次调用将失败。
【讨论】: