Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
Properties (属性) 是作为 key/value pairs (键/值对) 管理的配置值。在每对中,键和值都是 String
值。key 用于标识和获取值,就像变量名用于获取变量的值一样。例如,能够下载文件的应用程序可能使用名为“download.lastDirectory”的属性来跟踪上次下载所使用的目录。
要管理属性,请创建 java.util.Properties
的实例。此类提供以下方法:
Properties
对象中,有关流的介绍,请参阅 Basic I/O 课程中的 I/O Streams 部分。
Properties
继承 java.util.Hashtable
。从 Hashtable
继承的一些方法支持以下操作:
Properties
对象中,Properties
列表,Properties
对象是否为空。System
类维护一个 Properties
对象,该对象定义当前工作环境的配置。有关这些属性的更多信息,请参阅 System Properties。本节的其余部分介绍了如何使用属性来管理应用程序配置。
下图说明了典型应用程序在执行过程中如何使用 Properties
对象管理其配置数据。
启动
Properties
对象中。通常,默认属性与 .class
和应用程序的其他资源文件一起存储在磁盘上的文件中。Properties
对象,并加载上次运行应用程序时保存的属性。许多应用程序基于每个用户存储属性,因此在此步骤中加载的属性通常位于此应用程序在用户主目录中维护的特定目录中的特定文件中。最后,应用程序使用默认和记住的属性来初始化自身。运行
Properties
对象以反映这些更改。如果要在将来的会话中记住用户更改,则必须保存它们。
退出
以下 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
中。此文件中的属性是上次调用时从应用程序保存的属性,如下一节中所述。
以下示例使用 Properties.store
写出上一个示例中的应用程序属性。每次都不需要保存默认属性,因为它们永远不会更改。
FileOutputStream out = new FileOutputStream("appProperties"); applicationProps.store(out, "---No Comment---"); out.close();
store
方法需要一个要写入的流,以及一个用作输出顶部注释的字符串。
应用程序设置了 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()
用户在执行期间与应用程序的交互可能会影响属性设置。这些更改应反映在 Properties
对象中,以便在应用程序退出时保存它们(并调用 store
方法)。以下方法更改 Properties
对象中的属性:
setProperty(String key, String value)
Properties
对象中。
remove(Object key)
Hashtable
中定义,因此接受 String
以外的键和值参数类型。始终对键和值使用 String
,即使该方法允许其他类型。也不要在 Properties
对象上调用 Hashtable.set
或 Hastable.setAll
;始终使用 Properties.setProperty
。