【问题标题】:Properties Class vs System Properties属性类与系统属性
【发布时间】:2015-08-17 01:51:05
【问题描述】:

我刚刚读到可以使用Properties 类存储键/值对(属性),该类是HashTable 的子类。但是,我还读到您可以使用System.setProperty 直接存储属性。

那么我应该使用哪一个?每个的真正用例是什么?

非常感谢。

【问题讨论】:

    标签: java properties-file


    【解决方案1】:

    据我所知System.setProperty() 使用java.util.Properties 类,因此它们使用相同的支持类。但是,System.setProperties() 使用的属性类是从 VM 中检索的,请查看 documentation for System.getProperties() 以获取有关属性集的更多信息。

    您可能需要考虑通过设置系统属性来尝试实现什么,因为它们通常是描述系统版本和路径的运行时变量。

    在我见过的所有应用程序中,System.properties 都用作只读列表,如果您想将属性写出某个地方以供系统使用,您最好将其放在数据库表中(如果您要在运行时更改这些选项)并像这样使用它。如果属性文件是一个相对静态的程序选项列表,您可能需要尝试使用属性文件,您需要能够在应用程序的不同实例上有所不同,因此可能用于品牌推广。

    Properties 类的主要目的是能够将列表键值列表序列化为流,请参见Properties

    【讨论】:

      【解决方案2】:

      propertyJava.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);
          }
      }

      【讨论】:

      • 感谢您尝试回答,但是,我问的是使用 Properties 类和使用 System Properties 之间的区别。我实际上已经知道您作为示例提供的代码......但它没有详细说明它们各自的用例。
      【解决方案3】:

      如果您不想修改很多属性,最好使用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 禁用属性写入,但启用属性读取,则第二次调用将失败。

      【讨论】:

        猜你喜欢
        • 2013-12-22
        • 1970-01-01
        • 1970-01-01
        • 2015-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多