15.10.6 Properties
属性(Properties)是Hashtable的一个子类。它用来保持值的列表,在其中关键字和值都是字符串(String)。Properties类被许多其他的Java类所使用。例如,当获得系统环境值时,System.getProperties( )返回对象的类型。
Properties定义了下面的实例变量:
Properties defaults;
这个变量包含了一个与属性(Properties)对象相关联的默认属性列表。Properties定义了如下的构造函数:
Properties( )
Properties(Properties propDefault)
第一种形式创建一个没有默认值的属性(Properties)对象。第二种形式创建一个将propDefault作为其默认值的对象。在这两种情况下,属性列表都是空的。除了Properties从Hashtable中继承下来的方法之外,Properties自己定义的方法列在表15-14中。Properties也包含了一个不被赞成使用的方法:save( )。它被store( )方法所取代,因为它不能正确地处理错误。
表15-14 由Properties 定义的从以前版本遗留下来的方法
方法 描述
String getProperty(String key) 返回与key相关联的值。如果key既不在列表中,也不在默认属性列表中,则返回一个null对象
String getProperty(String key,
String defaultProperty)
返回与key相关联的值。如果key既不在列表中,也不在默认属性列表中,则返回defaultProperty
void list(PrintStream streamOut) 将属性列表发送给与streamOut相链接的输出流
void list(PrintWriter streamOut) 将属性列表发送给与streamOut相链接的输出流
续表
方法 描述
void load(InputStream streamIn)
throws IOException
从与streamIn相链接的输入数据流输入一个属性列表
Enumeration propertyNames( ) 返回关键字的枚举,也包括那些在默认属性列表中找到的关键字
Object setProperty(String key, String value) 将value与key关联。返回与key关联的前一个值,如果存
在这样的关联,则返回null(为了保持一致性,在Java 2中新增加的)
void store(OutputStream streamOut,
String description)
在写入由description指定的字符串之后,属性列表被写入与
streamOut相链接的输出流(在Java 2中新增加的)
Properties类的一个有用的功能是可以指定一个默认属性,如果没有值与特定的关键字相关联,则返回这个默认属性。例如,默认值可以与关键字一起在getProperty( )方法中被指定——如getProperty(“name”,“default value”)。如果“name”值没有找到,则返回“defaultvalue”。当构造一个Properties对象时,可以传递Properties的另一个实例做为新实例的默认值。在这种情况下,如果对一个给定的Properties对象调用getProperty(“foo”),而“foo”并
不存在时,Java在默认Properties对象中寻找“foo”。它允许默认属性的任意层嵌套。下面的例子说明了Properties。该程序创建一个属性列表,在其中关键字是美国的州名,值是这些州的首府的名字。注意试图寻找包括默认值的Florida的首府时的情况。
// Demonstrate a Property list.
import java.util.*;
class PropDemo {
public static void main(String args[]) {
Properties capitals = new Properties();
Set states;
String str;
capitals.put("Illinois", "Springfield");
capitals.put("Missouri", "Jefferson City");
capitals.put("Washington", "Olympia");
capitals.put("California", "Sacramento");
capitals.put("Indiana", "Indianapolis");
// Show all states and capitals in hashtable.
states = capitals.keySet(); // get set-view of keys
Iterator itr = states.iterator();
while(itr.hasNext()) {
str = (String) itr.next();
System.out.println("The capital of " +
str + " is " +
capitals.getProperty(str)
+ ".");
}
System.out.println();
// look for state not in list -- specify default
str = capitals.getProperty("Florida", "Not Found");
System.out.println("The capital of Florida is "
+ str + ".");
}
}
该程序的输出如下所示:
The capital of Missouri is Jefferson City.
The capital of Illinois is Springfield.
The capital of Indiana is Indianapolis.
The capital of California is Sacramento.
The capital of Washington is Olympia.
The capital of Florida is Not Found.
由于Florida不在列表中,所以使用了默认值。尽管当调用getProperty( )方法时,使用默认值是十分有效的,正如上面的程序所展示的那样,对大多数属性列表的应用来说,有更好的方法去处理默认值。为了更大的灵活性,当构造一个属性(Properties)对象时,指定一个默认的属性列表。如果在主列表中没有发现期望的关键字,将会搜索默认列表。例如,下面是对前面程序稍作修改的程序。在该程序中,有一个指定州的默认列表。在这种情况下,当搜索Florida时,将在默认列表中找到它。
// Use a default property list.
import java.util.*;
class PropDemoDef {
public static void main(String args[]) {
Properties defList = new Properties();
defList.put("Florida", "Tallahassee");
defList.put("Wisconsin", "Madison");
Properties capitals = new Properties(defList);
Set states;
String str;
capitals.put("Illinois", "Springfield");
capitals.put("Missouri", "Jefferson City");
capitals.put("Washington", "Olympia");
capitals.put("California", "Sacramento");
capitals.put("Indiana", "Indianapolis");
// Show all states and capitals in hashtable.
states = capitals.keySet(); // get set-view of keys
Iterator itr = states.iterator();
while(itr.hasNext()) {
str = (String) itr.next();
System.out.println("The capital of " +
str + " is " +
capitals.getProperty(str)
+ ".");
}
System.out.println();
// Florida will now be found in the default list.
str = capitals.getProperty("Florida");
System.out.println("The capital of Florida is "
+ str + ".");
}
}