Java的properties配置文件
Properties类与Properties配置文件
Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存属性集。不过Properties有特殊的地方,就是它的键和值都是字符串类型。
jdk文档的描述: Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。
因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用 put 和 putAll 方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。相反,应该使用 setProperty 方法。如果在“不安全”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。类似地,如果在“不安全”的 Properties 对象(即包含非 String 的键)上调用 propertyNames 或 list 方法,则该调用将失败。
常用方法:
setProperty
public Object setProperty(String key,
String value)调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
参数:
key - 要置于属性列表中的键。
value - 对应于 key 的值。
返回:
属性列表中指定键的旧值,如果没有值,则为 null。
load
public void load(InputStream inStream)
throws IOException从输入流中读取属性列表(键和元素对)。输入流按 load(Reader) 中所指定的、简单的面向行的格式,并假定使用 ISO 8859-1 字符编码;即每个字节都是 Latin1 字符。对于非 Latin1 的字符和某些特殊字符,可以使用 Unicode 转义以键和元素的形式来表示它们。
此方法返回后,指定的流仍保持打开状态。
参数:
inStream - 输入流。
抛出:
IOException - 如果读取输入流时发生错误。
IllegalArgumentException - 如果输入流包含错误的 Unicode 转义序列。
store
public void store(OutputStream out,
String comments)
throws IOException以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。
此方法未 编写此 Properties 表默认表的属性(如果有)。
此方法以 store(Writer) 中指定的相同格式输出注释、属性键和值,注意以下几点不同:
使用 ISO 8859-1 字符编码写入该流。
注释中不是 Latin-1 的字符针对其适当的十六进制值 xxxx 以 \uxxxx 的形式写入。
属性键或值中小于 \u0020 的字符和大于 \u007E 的字符针对适当的十六进制值 xxxx 以 \uxxxx 的形式写入。
写入各个项后,刷新输出流。此方法返回后,输出流仍保持打开状态。
参数:
out - 输出流。
comments - 属性列表的描述。
抛出:
IOException - 如果将此属性列表写入指定的输出流时,抛出 IOException。
ClassCastException - 如果此 Properties 对象包含任意非 String 的键或值。
NullPointerException - 如果 out 为 null。
getProperty
public String getProperty(String key)用指定的键在此属性列表中搜索属性。如果在此属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回 null。
参数:
key - 属性键。
返回:
属性列表中具有指定键值的值。
stringPropertyNames
public Set<String> stringPropertyNames()返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。其键或值不是 String 类型的属性被忽略。
返回的 set 不受 Properties 对象支持。对此 Properties 的改变不能在该 set 中反映出来,反之亦然。
返回:
此属性列表中的键集,其中该键及其对应值是字符串,包括默认属性列表中的键。
简单实例: 首先a.properties文件:
name=lin
pass=1996
读取a.properties属性列表,与生成属性文件b.properties:
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
InputStream inputStream = new BufferedInputStream(new FileInputStream("a.properties"));
properties.load(inputStream);
Iterator<String> iterator = properties.stringPropertyNames().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
System.out.println(key+properties.getProperty(key));
}
inputStream.close();
FileOutputStream fileOutputStream = new FileOutputStream("b.properties",true);
properties.setProperty("55","222");
properties.store(fileOutputStream, "new");
fileOutputStream.close();
}