文档

Java™ 教程-Java Tutorials 中文版
系统属性
Trail: Essential Classes
Lesson: The Platform Environment
Section: System Utilities

系统属性

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

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

Key 含义
"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 Manager 可以限制对系统属性的访问。这通常是 applet 中的一个问题,它无法读取某些系统属性,也无法编写 any (任何) 系统属性。有关访问 applet 中的系统属性的更多信息,请参阅 Doing More With Java Rich Internet Applications 课程中的 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 对象表示的新集替换整个系统属性集。


警告: 更改系统属性具有潜在危险,应谨慎处理。许多系统属性在启动后不会重新读取,它们只是为了提供信息。更改某些属性可能会产生意外的副作用。

下一个示例 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 解释程序的调用。运行时系统每次启动时都会重新初始化系统属性。如果要保持对系统属性的更改,则应用程序必须在退出之前将值写入某个文件,并在启动时再次读取它们。


Previous page: Command-Line I/O Objects
Next page: The Security Manager