在“属性”中,我们研究了应用程序可以使用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" 用户帐号名称

安全考虑:安全管理器可以限制对系统属性的访问。这是applet中最常见的问题,阻止了applet读取某些系统属性以及写入任何系统属性。有关在applet中访问系统属性的更多信息,请参阅“使用JavaRichInternet应用程序做更多事情”课程中的“系统属性”。


读取系统属性

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

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

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

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

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

写入系统属性

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


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


下一个示例 PropertiesTest创建一个Properties对象,并从myProperties.txt中对其进行初始化 。

  1. subliminal.message=Buy StayPuft Marshmallows!

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

  1. import java.io.FileInputStream;
  2. import java.util.Properties;
  3. public class PropertiesTest {
  4. public static void main(String[] args)
  5. throws Exception {
  6. // set up new properties object
  7. // from file "myProperties.txt"
  8. FileInputStream propFile =
  9. new FileInputStream( "myProperties.txt");
  10. Properties p =
  11. new Properties(System.getProperties());
  12. p.load(propFile);
  13. // set the system properties
  14. System.setProperties(p);
  15. // display new properties
  16. System.getProperties().list(System.out);
  17. }
  18. }

请注意,PropertiesTest如何创建Properties对象p,用作setProperties的参数:

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

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

  1. Properties p = new Properties();

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

  1. java.vendor=Acme Software Company

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