System Properties

Properties中,我们研究了应用程序可以使用Properties对象维护其配置的方式。 Java 平台本身使用Properties对象来维护其自己的配置。 System类维护一个Properties对象,该对象描述当前工作环境的配置。系统属性包括有关当前用户,Java 运行时的当前版本以及用于分隔文件路径名组成部分的字符的信息。

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

KeyMeaning
"file.separator"分隔文件路径各部分的字符。在 UNIX 上为“ /”,在 Windows 上为“ \”。
"java.class.path"用于查找包含类文件的目录和 JAR 归档文件的路径。Classpath 的元素由path.separator属性中指定的特定于平台的字符分隔。
"java.home"Java Runtime Environment(JRE)的安装目录
"java.vendor"JRE 供应商名称
"java.vendor.url"JRE 供应商 URL
"java.version"JRE 版本号
"line.separator"os 用于分隔文本文件中各行的 Sequences
"os.arch"os 架构
"os.name"os 名称
"os.version"作业系统版本
"path.separator"java.class.path中使用的路径分隔符
"user.dir"用户工作目录
"user.home"用户主目录
"user.name"用户帐号名称

Security consideration:

Security Manager可以限制对系统属性的访问。这是 applet 中最常见的问题,阻止了 applet 读取某些系统属性以及写入任何系统属性。有关在 applet 中访问系统属性的更多信息,请参考使用 Java Rich Internet 应用程序做更多的事情类中的System Properties

读取系统属性

System类具有两种用于读取系统属性的方法:getPropertygetProperties

System类具有getProperty的两个不同版本。两者都检索参数列表中命名的属性的值。这两个getProperty方法中最简单的一个带有一个参数,即属性键。例如,要获取path.separator的值,请使用以下语句:

System.getProperty("path.separator");

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

另一版本的getProperty需要两个String参数:第一个参数是要查找的键,第二个参数是在找不到键或没有值的情况下返回的默认值。例如,以下对getProperty的调用将查找名为subliminal.messageSystem属性。这不是有效的系统属性,因此此方法返回第二个参数提供的默认值,而不是返回 null:“ Buy StayPuft Marshmallows!

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

System类提供的用于访问属性值的最后一个方法是getProperties方法,该方法返回Properties对象。该对象包含完整的系统属性定义集。

编写系统属性

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

Warning:

更改系统属性有潜在危险,应谨慎执行。启动后不会重新读取许多系统属性,这些属性仅供参考。更改某些属性可能会产生意想不到的副作用。

下一个示例PropertiesTest创建一个Properties对象,并从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中列出的属性添加到运行时系统在启动时创建的属性集中的效果。请注意,应用程序可以创建p而无需任何默认的Properties对象,如下所示:

Properties p = new Properties();

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

java.vendor=Acme Software Company

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

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