Properties
属性是作为键/值对 管理 的配置值。在每对中,键和值均为String个值。键标识并用于检索值,就像变量名用于检索变量的值一样。例如,能够下载文件的应用程序可能使用名为“ download.lastDirectory”的属性来跟踪上次下载所使用的目录。
要 管理 属性,请创建java.util.Properties的实例。此类提供以下方法:
-
将键/值对从流中加载到
Properties
对象中, -
从其键检索值,
-
列出密钥及其值,
-
枚举键,以及
-
将属性保存到流中。
有关流的介绍,请参考Basic I/O类中的I/O Streams部分。
Properties
扩展了java.util.Hashtable。从Hashtable
继承的某些方法支持以下操作:
-
测试以查看
Properties
对象中是否有特定的键或值, -
获取当前键/值对的数量,
-
删除密钥及其值,
-
将键/值对添加到
Properties
列表, -
枚举值或键,
-
通过其键检索值,以及
-
找出
Properties
对象是否为空。
Security Considerations:
对属性的访问需要当前安全 管理 器的批准。假定本节中的示例代码段位于独立的应用程序中,默认情况下,这些应用程序没有安全 管理 器。Servlets 中的相同代码可能无法运行,具体取决于运行它的浏览器。有关小应用程序安全性限制的信息,请参见Java Applets类中的Servlets 可以做什么和不能做什么。
System
类维护一个Properties
对象,该对象定义当前工作环境的配置。有关这些属性的更多信息,请参见System Properties。本节的其余部分说明了如何使用属性来 管理 应用程序配置。
应用程序生命周期中的属性
下图说明了典型应用程序在执行过程中如何使用Properties
对象 管理 其配置数据。
-
Starting Up
前三个框中给出的操作在应用程序启动时发生。首先,应用程序将知名位置的默认属性加载到Properties
对象中。通常,默认属性与应用程序的.class
和其他资源文件一起存储在磁盘上的文件中。
接下来,该应用程序创建另一个Properties
对象,并加载自上次运行该应用程序以来保存的属性。许多应用程序按用户存储属性,因此在此步骤中加载的属性通常位于该应用程序在用户主目录中维护的特定目录中的特定文件中。最后,应用程序使用默认的和记住的属性进行初始化。
这里的关键是一致性。应用程序必须始终将属性加载并保存到同一位置,以便下次执行时可以找到它们。 -
Running
在应用程序执行期间,用户可能会在“首选项”窗口中更改某些设置,并且Properties
对象已更新以反映这些更改。如果要在以后的会话中记住用户的更改,则必须将其保存。 -
Exiting
退出后,应用程序会将属性保存到其众所周知的位置,以在下次启动应用程序时再次加载。
设置属性对象
以下 Java 代码执行上一部分中描述的前两个步骤:加载默认属性和加载记住的属性:
. . .
// create and load default properties
Properties defaultProps = new Properties();
FileInputStream in = new FileInputStream("defaultProperties");
defaultProps.load(in);
in.close();
// create application properties with default
Properties applicationProps = new Properties(defaultProps);
// now load properties
// from last invocation
in = new FileInputStream("appProperties");
applicationProps.load(in);
in.close();
. . .
首先,应用程序设置默认的Properties
对象。如果未在其他位置显式设置值,则此对象包含要使用的属性集。然后,load 方法从磁盘上名为defaultProperties
的文件中读取默认值。
接下来,应用程序使用其他构造函数来创建第二个Properties
对象applicationProps
,其默认值包含在defaultProps
中。检索属性时,默认值起作用。如果在applicationProps
中找不到该属性,则将搜索其默认列表。
最后,代码从名为appProperties
的文件将一组属性加载到applicationProps
中。该文件中的属性是上次调用时从应用程序中保存的属性,如下一节所述。
Saving Properties
下面的示例使用Properties.store
重写上一示例的应用程序属性。默认属性无需每次都保存,因为它们永远不会更改。
FileOutputStream out = new FileOutputStream("appProperties");
applicationProps.store(out, "---No Comment---");
out.close();
store
方法需要一个要写入的流以及在输出顶部用作 注解 的字符串。
获取 Property 信息
一旦应用程序设置了其Properties
对象,应用程序就可以查询该对象以获取有关其包含的各种键和值的信息。应用程序启动后会从Properties
对象获取信息,以便它可以根据用户的选择进行初始化。 Properties
类具有几种获取属性信息的方法:
-
contains(Object value)
和containsKey(Object key)
如果值或键位于Properties
对象中,则返回true
。Properties
从Hashtable
继承这些方法。因此,它们接受Object
参数,但仅应使用String
值。 -
getProperty(String key)
和getProperty(String key, String default)
返回指定属性的值。第二个版本提供了默认值。如果找不到密钥,则返回默认值。 -
list(PrintStream s)
和list(PrintWriter w)
将所有属性写入指定的流或写入器。这对于调试很有用。 -
elements()
,keys()
和propertyNames()
返回一个Enumeration
,其中包含Properties
对象中包含的键或值(如方法名所示)。keys
方法仅返回对象本身的键;propertyNames
方法也返回默认属性的键。 -
stringPropertyNames()
类似于propertyNames
,但返回Set<String>
,并且仅返回键和值均为字符串 的属性的名称。请注意,Set
对象不受Properties
对象的支持,因此其中一个更改不会影响另一个。 -
size()
返回键/值对的当前数量。
Setting Properties
用户在执行过程中与应用程序的交互可能会影响属性设置。这些更改应反映在Properties
对象中,以便在应用程序退出(并调用store
方法)时将其保存。以下方法更改Properties
对象中的属性:
-
setProperty(String key, String value)
将键/值对放入Properties
对象。 -
remove(Object key)
删除与键关联的键/值对。
Note:
上述某些方法是在Hashtable
中定义的,因此可以接受String
以外的键和值参数类型。即使该方法允许其他类型,也始终将String
用作键和值。也不要在Properties
对象上调用Hashtable.set
或Hastable.setAll
;始终使用Properties.setProperty
。