关于Java的Properties类

Properties类

先来学习下Properties类吧。

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。
属性列表中每个键及其对应值都是一个字符串。
一个属性列表可包含另一个属性列表作为它的“默认值”;
如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。

我感觉我怎么听不懂这句话是什么意思呢?暂时先不管了吧
因为 Properties 继承于 Hashtable,所以它仍可以当作一个HashTable看咯。

构造方法
Properties()
    创建一个无默认值的空属性列表。
Properties(Properties defaults)
    创建一个带有指定默认值的空属性列表。

常规方法
String getProperty(String key)
    用指定的键在此属性列表中搜索属性。
String getProperty(String key, String defaultValue)
    用指定的键在属性列表中搜索属性。
void list(PrintStream out)
    将属性列表输出到指定的输出流。
void list(PrintWriter out)
    将属性列表输出到指定的输出流。
void load(InputStream inStream)
    从输入流中读取属性列表(键和元素对)。
void loadFromXML(InputStream in)
    将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。
Enumeration<?> propertyNames()
    返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。
void save(OutputStream out, String comments)
    已过时。 如果在保存属性列表时发生 I/O 错误,则此方法不抛出 IOException。
    保存属性列表的首选方法是通过 store(OutputStream out, String comments) 方法或 storeToXML(OutputStream os, String comment) 方法来进行。
Object setProperty(String key, String value)
    调用 Hashtable 的方法 put。
void store(OutputStream out, String comments)
    以适合使用 load 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。
void storeToXML(OutputStream os, String comment)
    发出一个表示此表中包含的所有属性的 XML 文档。
void storeToXML(OutputStream os, String comment, String encoding)
    使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。

 

在上面的这些方法中load方法比较重要,现着重把这个方法作以下的说明。

1、对于输入流的处理
此方法根据行来处理输入。通过行结束符字符集(\n 或 \r 或 \r\n),或者通过文件的结尾来终止输入的自然行。
一个自然行可能是一个空行、注释行或保存了键-元素对的某些部分。

2、如果有键值对的长度超过了一行
保存所有键-元素对数据的逻辑行可能分散在多个相邻的自然行中,方法是用反斜杠字符 \ 转义行结束符序列。
注意,不能以此方式扩展注释行;每个内容为注释的自然行必须有其自己的注释指示符,正如下面所描述的。
如果一个逻辑行延伸到多个自然行上,那么这些连续的行会接受进一步的处理,这也在下面描述。
到达文件结尾前,会一直从输入流中读取各行。

3、注释和空白的处理
仅包含空白字符的自然行认为是空行并被忽略。
注释行以 ASCII 字符 '#' 或 '!' 作为其首个非空白字符;
注释行也被忽略并且不将其编码为键-元素信息。
除了行结束符,此方法还将空格字符(' ','\u0020')、制表符('\t','\u0009')和换页符('\f','\u000C')作为空白。

4、转义和续行
如果一个逻辑行分散在多个自然行中,则转义行结束符序列的反斜杠、行结束符序列和后续行开始处的任何空白,对键或元素的值都没有影响。
后面对键和元素分析的讨论将假定移除行继续符后,构成键和元素的所有字符都出现在单个自然行中。
注意,仅检查行结束符前面的字符,以便查看行结束符是否已转义是不够的;对于要转义的行结束符,必须有奇数个相邻的反斜杠。
由于是从左到右来处理输入内容的,所以行结束符前(或其他位置)非零、偶数 2n 个相邻的反斜杠在转义处理后会被编码成 n 个反斜杠。

5、键值对的读取
键包含行中下列区间内的所有字符:从首个非空白字符开始,直到(但不包括)首个非转义的 '='、 ':' 或非行结束符的空白字符。
所有这些键终止字符都可能包含在键中,方法是在其前面用反斜杠字符进行转义,例如:

\:\=

将是两字符的键 ":="。可以使用 \r 和 \n 转义序列包括行结束符字符。跳过键后面的所有空白字符;
如果键后的首个非空白字符是 '=' 或 ':',则忽略该字符并且跳过其后的所有空白字符。
行中所有剩余的字符都成为关联元素字符串的一部分;如果没有剩余的字符,则该元素为空字符串 ""。
一旦标识了组成键和元素的原始字符序列,则如上所述执行转义处理。

键值对处理的示例

示例1:
作为一个示例,以下三行都指定了键 "Truth" 和关联元素值 "Beauty":
Truth = Beauty
        Truth:Beauty
Truth                  :Beauty
示例2:
另一个示例,以下三行都指定了单个属性:
fruits                           apple, banana, pear, \
                                  cantaloupe, watermelon, \
                                  kiwi, mango
键是 "fruits",关联元素是:
"apple, banana, pear, cantaloupe, watermelon, kiwi, mango"注意,在每个 \ 的前面出现了一个空格,
这样最后的结果中每个逗号的后面将出现一个空格;
会将 \、行结束符和后续行中的前导空白字符简单地丢弃,并且不会 用一个或多个其他字符替换它们。
示例3:
现在有一行如下:
cheeses
指定键是 "cheeses" 并且关联元素是空字符串 ""。

 

load会抛出的错误为:
IOException - 如果读取输入流时发生错误。
IllegalArgumentException - 如果输入流包含错误的 Unicode 转义序列。

下面则三个代码示例都来源于这位作者的博客,我处于学习的目的就引过来了,见如下链接:

http://www.cnblogs.com/bakari/p/3562244.html

代码实例:

实例1:用来读取java JVM的信息

package com.Properties.test;

import java.util.Properties;

public class ReadJVM {
	public static void main(String[] args) {
		Properties prop = System.getProperties();
		// System.out.println(prop);	// 不要用这种方式打印,结果都在一行上
		// 下面这种方式不错
		prop.list(System.out);
	}
}

读出来的结果如下所示:
-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=D:\Program Files\Java\jdk1.8.0_73\jre...
java.vm.version=25.73-b02
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=D:\spider\test
java.runtime.version=1.8.0_73-b02
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=D:\Program Files\Java\jdk1.8.0_73\jre...
os.arch=amd64
java.io.tmpdir=C:\Users\tuhooo\AppData\Local\Temp\
line.separator=

java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 7
sun.jnu.encoding=GBK
java.library.path=D:\Program Files\Java\jdk1.8.0_73\bin...
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=6.1
user.home=C:\Users\tuhooo
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=GBK
java.specification.version=1.8
user.name=tuhooo
java.class.path=D:\spider\test\bin;D:\spider\test\lib...
java.vm.specification.version=1.8
sun.arch.data.model=64
java.home=D:\Program Files\Java\jdk1.8.0_73\jre
sun.java.command=com.Properties.test.ReadJVM
java.specification.vendor=Oracle Corporation
user.language=zh
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_73
java.ext.dirs=D:\Program Files\Java\jdk1.8.0_73\jre...
sun.boot.class.path=D:\Program Files\Java\jdk1.8.0_73\jre...
java.vendor=Oracle Corporation
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=amd64

实例2:从文件读入键值对
下面有个文件如下所示,现在要读进去
#正常的键值对
name=JJ
Weight=4444
Height=3333
!奇葩的键值对
\:\==Linux
#分布在多行上的
haha      =    C \
        C++
       
Truth1 = Beauty1
#以冒号为分隔符
        Truth2:Beauty2
Truth3                 :Beauty3
#以非换行的空白符为分隔
fruits                          apple, banana, pear, \
                                cantaloupe, watermelon, \
                                kiwi, mango

package com.Properties.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;

public class getProp {
	public static void main(String[] args) throws FileNotFoundException, IOException  {
		Properties prop = new Properties();
		prop.load(new FileInputStream("test.prop"));
		// 这里有个警告,说Enumeration这里是粗糙的类型
        Enumeration enum1 = prop.propertyNames();//得到配置文件的名字
        while(enum1.hasMoreElements()) {
        	// 作强制类型转换
            String strKey = (String) enum1.nextElement();
            // 获取键对应的值
            String strValue = prop.getProperty(strKey);
            System.out.println(strKey + "=" + strValue);
        }
	}
}

读出来的结果也并不是按照原来的顺序排列的

name=JJ
Height=3333
:==Linux
Truth3=Beauty3
Truth2=Beauty2
Truth1=Beauty1
fruits=apple, banana, pear, cantaloupe, watermelon, kiwi, mango
haha=C C++
Weight=4444

实例3:Properties的综合操作

package com.Properties.test;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Properties;

//关于Properties类常用的操作
public class maniProp {
//根据Key读取Value
	public static String GetValueByKey(String filePath, String key) {
		Properties pps = new Properties();
		try {
			InputStream in = new BufferedInputStream (new FileInputStream(filePath));  
			pps.load(in);
			String value = pps.getProperty(key);
			System.out.println(key + " = " + value);
			return value;
             
		}catch (IOException e) {
			e.printStackTrace();
			return null;
		}
    }
     
    //读取Properties的全部信息
    public static void GetAllProperties(String filePath) throws IOException {
		Properties pps = new Properties();
        InputStream in = new BufferedInputStream(new FileInputStream(filePath));
        pps.load(in);
        Enumeration en = pps.propertyNames(); //得到配置文件的名字
         
        while(en.hasMoreElements()) {
            String strKey = (String) en.nextElement();
            String strValue = pps.getProperty(strKey);
            System.out.println(strKey + "=" + strValue);
        }   
    }
     
    //写入Properties信息
    public static void WriteProperties (String filePath, String pKey, String pValue) throws IOException {
        Properties pps = new Properties();
         
        InputStream in = new FileInputStream(filePath);
        //从输入流中读取属性列表(键和元素对) 
        pps.load(in);
        //调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。  
        //强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
        OutputStream out = new FileOutputStream(filePath);
        pps.setProperty(pKey, pValue);
        //以适合使用 load 方法加载到 Properties 表中的格式,  
        //将此 Properties 表中的属性列表(键和元素对)写入输出流  
        pps.store(out, "Update " + pKey + " name");
    }
     
    public static void main(String [] args) throws IOException{
    	// 创建对象,然后将文件读进来,放到Properties中
    	// 再利用Properties的类进行操作
        String value = GetValueByKey("test.prop", "name");
        System.out.println(value);
        GetAllProperties("test.prop");
        WriteProperties("test.prop","long", "212");
    }
}

TO END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值