# 系统属性

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

在[属性](properties.html)中，我们检查了应用程序使用`Properties`对象维护其配置的方式。 Java 平台本身使用`Properties`对象来维护自己的配置。 `System`类维护一个`Properties`对象，该对象描述当前工作环境的配置。系统属性包括有关当前用户，Java 运行时的当前版本以及用于分隔文件路径名的组件的字符的信息。

下表描述了一些最重要的系统属性

| 键 | 含义 |
| --- | --- |
| `"file.separator"` | 用于分隔文件路径组件的字符。这是 UNIX 上的“`/`”和 Windows 上的“`\`”。 |
| `"java.class.path"` | 用于查找包含类文件的目录和 JAR 存档的路径。类路径的元素由`path.separator`属性中指定的特定于平台的字符分隔。 |
| `"java.home"` | Java Runtime Environment（JRE）的安装目录 |
| `"java.vendor"` | JRE 供应商名称 |
| `"java.vendor.url"` | JRE 供应商 URL |
| `"java.version"` | JRE 版本号 |
| `"line.separator"` | 操作系统用于分隔文本文件中的行的序列 |
| `"os.arch"` | 操作系统架构 |
| `"os.name"` | 操作系统名称 |
| `"os.version"` | 操作系统版本 |
| `"path.separator"` | `java.class.path`中使用的路径分隔符 |
| `"user.dir"` | 用户工作目录 |
| `"user.home"` | 用户主目录 |
| `"user.name"` | 用户帐户名称 |

* * *

**Security consideration:** Access to system properties can be restricted by the [Security Manager](security.html). This is most often an issue in applets, which are prevented from reading some system properties, and from writing _any_ system properties. For more on accessing system properties in applets, refer to [System Properties](../../deployment/doingMoreWithRIA/properties.html) in the [Doing More With Java Rich Internet Applications](../../deployment/doingMoreWithRIA/index.html) lesson.

* * *

## 阅读系统属性

`System`类有两种用于读取系统属性的方法：`getProperty`和`getProperties`。

`System`类有两个不同版本的`getProperty`。两者都检索参数列表中指定的属性的值。两个`getProperty`方法中较简单的方法是使用单个参数，即属性键。例如，要获取`path.separator`的值，请使用以下语句：

```
System.getProperty("path.separator");

```

`getProperty`方法返回包含属性值的字符串。如果该属性不存在，则此版本的`getProperty`返回 null。

另一个版本的`getProperty`需要两个`String`参数：第一个参数是要查找的键，第二个参数是如果找不到键或者没有值则返回的默认值。例如，以下`getProperty`调用会查找名为`subliminal.message`的`System`属性。这不是有效的系统属性，因此该方法不是返回 null，而是返回作为第二个参数提供的默认值：“`Buy StayPuft Marshmallows!`”

```
System.getProperty("subliminal.message", "Buy StayPuft Marshmallows!");

```

`System`类提供的访问属性值的最后一种方法是`getProperties`方法，它返回 [`Properties`](https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html) 对象。该对象包含一组完整的系统属性定义。

## 编写系统属性

要修改现有的系统属性集，请使用`System.setProperties`。此方法采用已初始化为包含要设置的属性的`Properties`对象。此方法使用`Properties`对象表示的新集替换整个系统属性集。

* * *

**Warning:** Changing system properties is potentially dangerous and should be done with discretion. Many system properties are not reread after start-up and are there for informational purposes. Changing some properties may have unexpected side-effects.

* * *

下一个例子 [`PropertiesTest`](examples/PropertiesTest.java) 创建一个`Properties`对象并从 [`myProperties.txt`](examples/myProperties.txt) 初始化它。

```
subliminal.message=Buy StayPuft Marshmallows!

```

`PropertiesTest`然后使用`System.setProperties`将新的`Properties`对象安装为当前的系统属性集。

```
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);
    }
}

```

注意`PropertiesTest`如何创建`Properties`对象`p`，它用作`setProperties`的参数：

```
Properties p = new Properties(System.getProperties());

```

此语句使用当前系统属性集初始化新属性对象`p`，在此小应用程序的情况下，系统属性是由运行时系统初始化的属性集。然后，应用程序从文件`myProperties.txt`将其他属性加载到`p`中，并将系统属性设置为`p`。这具有将`myProperties.txt`中列出的属性添加到运行时系统在启动时创建的属性集的效果。请注意，应用程序可以在没有任何默认`Properties`对象的情况下创建`p`，如下所示：

```
Properties p = new Properties();

```

另请注意，系统属性的值可以被覆盖！例如，如果`myProperties.txt`包含以下行，则`java.vendor`系统属性将被覆盖：

```
java.vendor=Acme Software Company

```

通常，请注意不要覆盖系统属性。

`setProperties`方法更改当前运行的应用程序的系统属性集。这些变化并不持久。也就是说，更改应用程序中的系统属性不会影响将来对此解释程序或任何其他应用程序的 Java 解释程序的调用。运行时系统每次启动时都会重新初始化系统属性。如果要保持对系统属性的更改，则应用程序必须在退出之前将值写入某个文件，并在启动时再次读取它们。