文档

Java™教程
隐藏目录
系统属性
路径:基本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" 用户账户名称

安全注意事项: 访问系统属性可能受到安全管理器的限制。这通常是applet中的一个问题,它们被禁止读取某些系统属性,并且不能写入任何系统属性。有关在applet中访问系统属性的更多信息,请参阅Java丰富互联网应用程序开发进阶课程中的系统属性

读取系统属性

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

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

System.getProperty("path.separator");

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

另一个getProperty的版本需要两个String参数:第一个参数是要查找的键,第二个参数是如果找不到键或键没有值时要返回的默认值。例如,下面的getProperty调用查找名为subliminal.messageSystem属性。这不是一个有效的系统属性,因此该方法会返回作为第二个参数提供的默认值:"Buy StayPuft Marshmallows!"

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

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

写入系统属性

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


警告: 更改系统属性具有潜在危险,并应慎重进行。许多系统属性在启动后不会被重新读取,仅供信息用途。更改某些属性可能会产生意外的副作用。

下一个示例PropertiesTest创建一个Properties对象,并从myProperties.txt文件中初始化它。

subliminal.message=购买StayPuft棉花糖!

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

import java.io.FileInputStream;
import java.util.Properties;

public class PropertiesTest {
    public static void main(String[] args)
        throws Exception {

        // 设置新的属性对象
        // 来自文件"myProperties.txt"
        FileInputStream propFile =
            new FileInputStream( "myProperties.txt");
        Properties p =
            new Properties(System.getProperties());
        p.load(propFile);

        // 设置系统属性
        System.setProperties(p);
        // 显示新属性
        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解释器的未来调用。运行时系统每次启动时都会重新初始化系统属性。如果要使系统属性的更改持久,那么应用程序必须在退出之前将值写入某个文件,并在启动时再次读取它们。


上一页:命令行I/O对象
下一页:安全管理器