Properties类详细解析

た 入场券 2022-08-20 13:20 430阅读 0赞
  1. java.util
  2. Properties
  3. java.lang.Object
  4. java.util.Dictionary<K,V>
  5. java.util.Hashtable<Object,Object>
  6. java.util.Properties

所有已实现的接口:

  1. Serializable, Cloneable, Map<Object,Object>

直接已知子类:

  1. Provider
  2. Public class Properties extends HashTable<Object,Object>

Properties类表示了一个持久的属性集,它是在一个文件中存储键值对儿的,其中键值对儿以等号分隔。Properties可保存在流中或从流中加载。属性列表中的每个键及其所对应的值都是字符串。Properties类是线程安全的:多个线程可以共享单个Properties对象而无需进行外部同步。一组属性示例:
foo=bar
fu=baz

一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。

如果在“不安全”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。类似地,如果在“不安全”的 Properties 对象(即包含非 String 的键)上调用 propertyNames 或 list 方法,则该调用将失败。

除了输入/输出流使用 ISO 8859-1 字符编码外,load(InputStream) / store(OutputStream, String)方法与 load(Reader)/store(Writer, String)对的工作方式完全相同。

loadFromXML(InputStream)storeToXML(OutputStream, String, String)方法按简单的 XML 格式加载和存储属性。默认使用 UTF-8 字符编码,但如果需要,可以指定某种特定的编码。XML 属性文档具有以下 DOCTYPE 声明:

  1. <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

一下列出了Properties的方法摘要,有关每个方法的详细使用情况,请参看API:

http://www.apihome.cn/api/java/Properties.html

这里写图片描述

示例练习一:如何装载属性文件并列出它当前的一组键和值。

思路:传递属性文件的输入流InputStream给load()方法,会将改属性文件中的每个键值对儿添加到Properties实例中;然后条用list()列出所有属性或者使用getProperty()获取单独的属性。(注意 list() 方法的输出中键-值对的顺序与它们在输入文件中的顺序不一样。 Properties 类在一个散列表(hashtable,事实上是一个 Hashtable 子类)中储存一组键-值对,所以不能保证顺序。 )

代码实现:

  1. package com.lmb.thread;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.util.Properties;
  6. public class PropertiesTest {
  7. public static void main(String[] args) {
  8. Properties properties = new Properties();
  9. try {
  10. properties.load(new FileInputStream("test.properties"));//加载属性文件
  11. properties.list(System.out);//将属性文件中的键值对儿打印到控制台
  12. properties.getProperty("foo");
  13. } catch (FileNotFoundException e) {
  14. e.printStackTrace();
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }

示例练习二:如何装载XML版本的属性文件并列出它当前的一组键和值。(只有装载方法有差异,其余完全相同load(),loadFromXML())

  1. package com.lmb.thread;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.util.Properties;
  6. public class PropertiesTest {
  7. public static void main(String[] args) {
  8. Properties properties = new Properties();
  9. try {
  10. properties.loadFromXML(new FileInputStream("test.xml"));//加载属性文件
  11. properties.list(System.out);//将属性文件中的键值对儿打印到控制台
  12. properties.getProperty("foo");
  13. } catch (FileNotFoundException e) {
  14. e.printStackTrace();
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }

示例练习三:如何将文件保存到属性文件中?

  1. import java.util.*;
  2. import java.io.*;
  3. public class StoreXML {
  4. public static void main(String args[]) throws Exception {
  5. Properties prop = new Properties();
  6. prop.setProperty("one-two", "buckle my shoe");
  7. prop.setProperty("three-four", "shut the door");
  8. prop.setProperty("five-six", "pick up sticks");
  9. prop.setProperty("seven-eight", "lay them straight");
  10. prop.setProperty("nine-ten", "a big, fat hen");
  11. prop.storeToXML(new FileOutputStream("test.xml"), "saveXML");//将键值对儿保存到XML文件中
  12. prop.store(new FileOutputStream("test.properties"), "saveProperties");//将键值对儿保存到普通的属性文件中
  13. fos.close();
  14. }
  15. }

将键值对儿保存到XML文件中的输出结果如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
  3. <properties>
  4. <comment>Rhyme</comment>
  5. <entry key="seven-eight">lay them straight</entry>
  6. <entry key="five-six">pick up sticks</entry>
  7. <entry key="nine-ten">a big, fat hen</entry>
  8. <entry key="three-four">shut the door</entry>
  9. <entry key="one-two">buckle my shoe</entry>
  10. </properties>

将键值对儿保存到普通的属性文件中输出结果如下:

  1. one-two=buckle my shoe
  2. three-four=shut the door
  3. five-six=pick up sticks
  4. seven-eight=lay them straight
  5. nine-ten=a big, fat hen

注意:从一个XML文件中装载一组属性,其DTD文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- DTD for properties -->
  3. <!ELEMENT properties ( comment?, entry* ) >
  4. <!ATTLIST properties version CDATA #FIXED "1.0">
  5. <!ELEMENT comment (#PCDATA) >
  6. <!ELEMENT entry (#PCDATA) >
  7. <!ATTLIST entry key CDATA #REQUIRED>

在外围 <properties> 标签中包装的是一个 <comment> 标签,后面是任意数量的 <entry>标签。对每一个 <entry> 标签,有一个键属性,输入的内容就是它的值。

Properties获取数据乱码解决

1.原因

Properties调用load(InputStream)时,读取文件时使用的默认编码为ISO-8859-1;当我们将中文放入到properties文件中,通过getProperty(key)获取值时,取到得数据是ISO-8859-1格式的,但是ISO-8859-1是不能识别中文的。

2.解决方法

通过getProperty()获取的数据data既然是ISO-8859-1编码的,就通过data.getByte(“iso-8859-1”)获取获取,使用new String(data.getByte(“iso-8859-1”),”UTF-8”)进行转换。当然properties文件的编码类型需要和new String(Byte[],charset)中的第二个参数的编码类型相同。

发表评论

表情:
评论列表 (有 0 条评论,430人围观)

还没有评论,来说两句吧...

相关阅读