【Java基础】Java中的持久属性集Properties
Properties 类的介绍
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用 put 和 putAll 方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。相反,应该使用 setProperty 方法。如果在“不安全”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。类似地,如果在“不安全”的 Properties 对象(即包含非 String 的键)上调用 propertyNames 或 list 方法,则该调用将失败。
Properties类的构造方法
Properties()
创建一个无默认值的空属性列表。
Properties(Properties defaults)
创建一个带有指定默认值的空属性列表。
Properties的使用
由于Properties是Hashtable<Object,Object>的子类,我们可以将其看成是一个map集合,可以存储key-value键值对,只不过Properties希望你存储的都是字符串的键值,而且我们定义的时候不能定义泛型,因为默认希望你存储的都是<String,String>。但是由于其继承了Hashtable<Object,Object>的方法,我们也可以用put方法来put非String的键值。例如下面这几行代码是不会报错的:
public static void main(String[] args) throws IOException { Properties p = new Properties(); p.put(1111, 2222); p.setProperty("aaa", "1"); p.setProperty("bbb", "2"); p.setProperty("ccc", "3"); System.out.println(p.getProperty("aaa")); System.out.println(p.get(1111)); }
但Properties区别于Hashtable的最精彩的功能是可以对接流。看如下几个方法:
void list(PrintStream out) 将属性列表输出到指定的输出流。 void list(PrintWriter out) 将属性列表输出到指定的输出流。 void load(InputStream inStream) 从输入流中读取属性列表(键和元素对)。 void load(Reader reader) 按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。 void loadFromXML(InputStream in) 将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。 void store(OutputStream out, String comments) 以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。 void store(Writer writer, String comments) 以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。 void storeToXML(OutputStream os, String comment) 发出一个表示此表中包含的所有属性的 XML 文档。 void storeToXML(OutputStream os, String comment, String encoding) 使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。
就是说Properties可以对接流直接将Properties写出到文件或者加载到程序。例如下面的写入代码:
public static void main(String[] args) throws IOException { Properties p = new Properties(); Writer writer = new FileWriter("t.txt"); p.setProperty("aaa", "1"); p.setProperty("bbb", "2"); p.setProperty("ccc", "3"); p.store(writer,"set properties"); w.close(); System.out.println(p); }
最后文件t.txt中显示是这样子的:
#set properties #Fri Dec 04 16:20:01 HKT 2015 bbb=2 aaa=1 ccc=3
当然,也可以通过load方法将属性load进来:
public static void main(String[] args) throws IOException { Properties p = new Properties(); Reader reader = new FileReader("t.txt"); p.load(reader);
r.close(); System.out.println(p.getProperty("aaa")); System.out.println(p); }