# 属性

> 原文： [https://docs.oracle.com/javase/tutorial/essential/environment/properties.html](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html)

_ 属性 _ 是作为 _ 键/值对 _ 管理的配置值。在每对中，键和值都是 [`String`](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) 值。密钥标识并用于检索值，就像变量名用于检索变量的值一样。例如，能够下载文件的应用程序可能使用名为“download.lastDirectory”的属性来跟踪上次下载所使用的目录。

要管理属性，请创建 [`java.util.Properties`](https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html) 的实例。此类提供以下方法：

*   将键/值对从流中加载到`Properties`对象中，
*   从其键中检索值，
*   列出键及其值，
*   枚举键，和
*   将属性保存到流。

有关流的介绍，请参阅[基本 I / O](../../essential/io/index.html) 课程中的 [I / O 流](../../essential/io/streams.html)部分。

`Properties`扩展 [`java.util.Hashtable`](https://docs.oracle.com/javase/8/docs/api/java/util/Hashtable.html) 。从`Hashtable`继承的一些方法支持以下操作：

*   测试以查看特定键或值是否在`Properties`对象中，
*   获取当前键/值对的数量，
*   删除一个键及其值，
*   将键/值对添加到`Properties`列表，
*   枚举值或键，
*   通过其键检索值，和
*   找出`Properties`对象是否为空。

* * *

**Security Considerations:** Access to properties is subject to approval by the current security manager. The example code segments in this section are assumed to be in standalone applications, which, by default, have no security manager. The same code in an applet may not work depending on the browser in which it is running. See [What Applets Can and Cannot Do](../../deployment/applet/security.html) in the [Java Applets](../../deployment/applet/index.html) lesson for information about security restrictions on applets.

* * *

`System`类维护一个`Properties`对象，该对象定义当前工作环境的配置。有关这些属性的更多信息，请参见[系统属性](sysprop.html)。本节的其余部分介绍了如何使用属性来管理应用程序配置。

## 应用程序生命周期中的属性

下图说明了典型应用程序如何在执行过程中使用`Properties`对象管理其配置数据。

<center>![Possible lifecycle of a Properties object](img/22f18b5607448e44a6e1933d08c2268e.jpg)</center>

*   `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`中。此文件中的属性是上次调用时从应用程序保存的属性，如下一节中所述。

## 保存属性

以下示例使用`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()`
    返回包含`Properties`对象中包含的键或值（如方法名称所示）的`Enumeration`。 `keys`方法仅返回对象本身的键; `propertyNames`方法也返回默认属性的键。
*   `stringPropertyNames()`
    与`propertyNames`类似，但返回`Set&lt;String&gt;`，仅返回键和值均为字符串的属性名称。请注意，`Set`对象不支持`Set`对象，因此一个对象的更改不会影响另一个对象。
*   `size()`
    返回当前键/值对的数量。

## 设置属性

用户在执行期间与应用程序的交互可能会影响属性设置。这些更改应反映在`Properties`对象中，以便在应用程序退出时保存它们（并调用`store`方法）。以下方法更改`Properties`对象中的属性：

*   `setProperty(String key, String value)`
    将键/值对放在`Properties`对象中。
*   `remove(Object key)`
    删除与键关联的键/值对。

* * *

**Note:** Some of the methods described above are defined in `Hashtable`, and thus accept key and value argument types other than `String`. Always use `String`s for keys and values, even if the method allows other types. Also do not invoke `Hashtable.set` or `Hastable.setAll` on `Properties` objects; always use `Properties.setProperty`.

* * *