属性类与系统属性

时间:2015-06-03 03:08:21

标签: java properties-file

我刚刚读到可以使用Properties类存储键/值对(属性),HashTable类是System.setProperty的子类。但是,我还读过您可以使用foreach (@filelist) { chomp; my $File = $_; if ( $File =~ qr/.+/o ) { if ( $BaseLine ) { $BaseLineRegExpA = qr/^\Q$BaseLine\E\\/io; #these 2 regexes $BaseLineRegExpB = qr/^\Q$BaseLine\E;/io; #these 2 regexes if ( $File =~ /$BaseLineRegExpA/ ) { #... } elsif ( (!($File =~ /$BaseLineRegExpB/)) && (!(lc( $File ) eq lc( $BaseLine ) )) ) { $BaseLine = $File; } } } } 直接存储属性。

那么我使用哪一个?每个人的真实用例是什么?

非常感谢。

3 个答案:

答案 0 :(得分:1)

propertyJava.lang.System类型的静态成员变量,它是java.util.Properties类型。因此,System.setProperty(key)只是property setter方法。 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);
    }
}

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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