本节介绍一些帮助应用程序访问其启动上下文的配置实用程序。html
Properties
是做为键/值对管理的配置值,在每对中,键和值都是字符串值,键标识并用于检索值,就像变量名用于检索变量的值同样。例如,可以下载文件的应用程序可能使用名为“download.lastDirectory
”的属性来跟踪上次下载所使用的目录。java
要管理属性,请建立java.util.Properties的实例,此类提供如下方法:git
Properties
对象中有关流的介绍,请参阅基础I/O课程中的I/O流部分。github
Properties
扩展了java.util.Hashtable,从Hashtable
继承的一些方法支持如下操做:segmentfault
Properties
对象中Properties
列表中Properties
对象是否为空安全考虑因素:对属性的访问必须通过当前安全管理器的批准,假定本节中的示例代码段位于独立应用程序中,默认状况下,它们没有安全管理器,applet中的相同代码可能没法运行,具体取决于运行它的浏览器,有关applet安全性限制的信息,请参阅Java Applets课程中Applets能够作什么和不能作什么。
System
类维护一个Properties
对象,该对象定义当前工做环境的配置,有关这些属性的更多信息,请参阅系统属性,本节的其他部分介绍了如何使用属性来管理应用程序配置。api
下图说明了典型应用程序如何在执行过程当中使用Properties
对象管理其配置数据。数组
Properties
对象中,一般,默认属性与应用程序的.class
和其余资源文件一块儿存储在磁盘上的文件中。Properties
对象以反映这些更改,若是要在未来的会话中记住用户更改,则必须保存它们。如下Java代码执行上一节中描述的前两个步骤:加载默认属性并加载记住的属性:浏览器
. . . // create and load default properties Properties defaultProps = new Properties(); FileInputStream in = new FileInputStream("defaultProperties"); defaultProps.load(in); in.close(); // create application properties with default Properties applicationProps = new Properties(defaultProps); // now load properties // from last invocation in = new FileInputStream("appProperties"); applicationProps.load(in); in.close(); . . .
首先,应用程序设置默认的Properties
对象,若是未在其余位置显式设置值,则此对象包含要使用的属性集,而后,load
方法从名为defaultProperties
的磁盘上的文件中读取默认值。安全
接下来,应用程序使用不一样的构造函数来建立第二个Properties
对象applicationProps
,其默认值包含在defaultProps
中,在检索属性时,默认值开始起做用,若是在applicationProps
中找不到该属性,则搜索其默认列表。oracle
最后,代码从名为appProperties
的文件中将一组属性加载到applicationProps
中,此文件中的属性是上次调用时从应用程序保存的属性,以下一节中所述。
如下示例使用Properties.store
从上一个示例中写出应用程序属性,每次都不须要保存默认属性,由于它们永远不会更改。
FileOutputStream out = new FileOutputStream("appProperties"); applicationProps.store(out, "---No Comment---"); out.close();
store
方法须要一个要写入的流,以及一个用做输出顶部注释的字符串。
应用程序设置其Properties
对象后,应用程序能够查询对象以获取有关其包含的各类键和值的信息,应用程序在启动后从Properties
对象获取信息,以便它能够根据用户的选择初始化自身,Properties
类有几种获取属性信息的方法:
contains(Object value)
和containsKey(Object key)
Properties
对象中,则返回true
,属性从Hashtable
继承这些方法,所以,它们接受Object
参数,但只应使用String
值。getProperty(String key)
和getProperty(String key, String default)
list(PrintStream s)
和list(PrintWriter w)
elements()
、keys()
、和propertyNames()
Properties
对象中包含的键或值(由方法名称指示)的Enumeration
,keys
方法只返回对象自己的键,propertyNames
方法也返回默认属性的键。stringPropertyNames()
propertyNames
相似,但返回Set<String>
,而且仅返回其中键和值都是字符串的属性的名称,请注意,Set
对象不受Properties
对象的支持,所以一个对象的更改不会影响另外一个。size()
在执行期间用户与应用程序的交互可能会影响属性设置,这些更改应反映在Properties
对象中,以便在应用程序退出时保存它们(并调用store
方法),如下方法更改Properties
对象中的属性:
setProperty(String key, String value)
Properties
对象中。remove(Object key)
上面描述的一些方法是在Hashtable
中定义的,所以接受除String
以外的键和值参数类型,始终使用字符串做为键和值,即便该方法容许其余类型,也不要在Properties
对象上调用Hashtable.set
或Hastable.setAll
,始终使用Properties.setProperty
。
Java应用程序能够从命令行接受任意数量的参数,这容许用户在启动应用程序时指定配置信息。
用户在调用应用程序时输入命令行参数,并在要运行的类的名称后指定它们。例如,假设一个名为Sort
的Java应用程序对文件中的行进行排序,要对名为friends.txt
的文件中的数据进行排序,用户将输入:
java Sort friends.txt
启动应用程序时,运行时系统会经过字符串数组将命令行参数传递给应用程序的main
方法,在前面的示例中,命令行参数在包含单个String
:“friends.txt”的数组中传递给Sort
应用程序。
Echo示例单独在一行上显示其每一个命令行参数:
public class Echo { public static void main (String[] args) { for (String s: args) { System.out.println(s); } } }
如下示例显示用户如何运行Echo
:
java Echo Drink Hot Java Drink Hot Java
请注意,应用程序单独显示每一个单词 — Drink、Hot和Java,这是由于空格字符分隔了命令行参数,要将Drink、Hot和Java解释为单个参数,用户能够经过将它们括在引号内来加入它们。
java Echo "Drink Hot Java" Drink Hot Java
若是应用程序须要支持数字命令行参数,它必须将表示数字的String
参数(例如“34”)转换为数字值,这是一个将命令行参数转换为int
的代码片断:
int firstArg; if (args.length > 0) { try { firstArg = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.err.println("Argument" + args[0] + " must be an integer."); System.exit(1); } }
若是args[0]
的格式无效,则parseInt
会抛出NumberFormatException
,全部Number
类 — Integer
、Float
、Double
等 — 都有parseXXX
方法,它们将表示数字的String
转换为其类型的对象。
许多操做系统使用环境变量将配置信息传递给应用程序,与Java平台中的属性同样,环境变量是键/值对,其中键和值都是字符串,设置和使用环境变量的约定因操做系统和命令行解释器之间而异,要了解如何将环境变量传递给系统上的应用程序,请参阅系统文档。
在Java平台上,应用程序使用System.getenv来检索环境变量值,若是没有参数,getenv
将返回java.util.Map
的只读实例,其中映射键是环境变量名称,映射值是环境变量值,这在EnvMap示例中进行了演示:
import java.util.Map; public class EnvMap { public static void main (String[] args) { Map<String, String> env = System.getenv(); for (String envName : env.keySet()) { System.out.format("%s=%s%n", envName, env.get(envName)); } } }
使用String
参数,getenv
返回指定变量的值,若是未定义变量,则getenv
返回null
,Env示例使用getenv
以这种方式查询在命令行上指定的特定环境变量:
public class Env { public static void main (String[] args) { for (String env: args) { String value = System.getenv(env); if (value != null) { System.out.format("%s=%s%n", env, value); } else { System.out.format("%s is" + " not assigned.%n", env); } } } }
当Java应用程序使用ProcessBuilder对象建立新进程时,传递给新进程的默认环境变量集与提供给应用程序虚拟机进程的集合相同,应用程序可使用ProcessBuilder.environment
更改此集。
在不一样系统上实现环境变量的方式之间存在许多细微差异,例如,Windows忽略环境变量名称中的大小写,而UNIX则不会。使用环境变量的方式也各不相同,例如,Windows在名为USERNAME
的环境变量中提供用户名,而UNIX实现可能在USER
、LOGNAME
或二者中提供用户名。
为了最大化可移植性,当系统属性中的相同值可用时,请不要引用环境变量,例如,若是操做系统提供用户名,则它将始终在系统属性user.name
中可用。
如下是一些其余配置实用程序的汇总。
Preferences API容许应用程序在依赖于实现的备份存储中存储和检索配置数据,支持异步更新,而且多个线程甚至多个应用程序能够安全地更新同一组首选项,有关更多信息,请参阅Preferences API指南。
部署在JAR存档中的应用程序使用manifest
来描述存档的内容,有关更多信息,请参阅JAR文件中的打包程序课程。
Java Web Start应用程序的配置包含在JNLP文件中,有关更多信息,请参阅Java Web Start课程。
Java Plug-in applet的配置部分取决于用于在网页中嵌入applet的HTML标记,这些标记能够包含<applet>、<object>、<embed>和<param>,具体取决于applet和浏览器,有关更多信息,请参阅Java Applets课程。
java.util.ServiceLoader类提供了一个简单的service provider设施,service provider是service的实现 — 一组众所周知的接口和(一般是抽象的)类。service provider中的类一般实现接口并子类化service中定义的类,service provider能够做为扩展安装(请参阅扩展机制),经过将Providers添加到类路径或经过其余特定于平台的方式,也可使Providers可用。