一、概述。

之前说过,该对象是和IO流相结合的技术,所以和IO流结合在一起来讲比较合适。

public class Propertiesextends Hashtable<Object,Object>

该类的继承层次:

java.lang.Object

  |--java.util.Dictionnary<K,V>

    |--java.util.Hashtable<Object,Object>

      |--java.util.Properties

JDK1.6API对其描述:

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

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

简单来说,Properties类的特点是:

1.该集合中的键和值都是字符串类型。
2.集合中的数据可以保存到流中或者从流中获取数据。
3.通常该集合用于操作以键值对形式存在的配置文件。

二、常用方法。

0.构造方法。

Properties()
          创建一个无默认值的空属性列表。
Properties(Properties defaults)

          创建一个带有指定默认值的空属性列表。

第一个方法无默认值,第二个方法则有一个参数,该参数是Properties类型的,实际上是将defaults中的键值对作为新创建的Properties对象的默认属性列表。但是,新创建的对象并不会改变原有defaults的内容(无论增删),这样可能就会出现一些怪现象。

 private static void propertiesDemo01() {
Properties p=new Properties();
p.setProperty("01", "zhangsan");
p.setProperty("02", "lisi");
p.setProperty("03", "wangwu");
Properties pp=new Properties(p); pp.remove("01");
System.out.println(pp.getProperty("01"));
System.out.println(p.getProperty("01")); p.remove("01");
System.out.println(p.getProperty("01"));
System.out.println(pp.getProperty("01"));
}

该段代码的执行结果是:

 zhangsan
zhangsan
null
null

执行结果

可以看到,新建立的对象即使删除了defaults的键值对也仍然能够输出指定的信息,这是因为它的操作没有影响到defaults中的内容。但是查询则不一样,如果在当前属性列表中没有找到指定的键,则它会去默认属性列表中查找,如果没有才返回null。我们在这里可以发现,实际上defaults才是“幕后统治者”,新建立的对象无论增删改查都不会影响到它的内容,但是如果它自己增删改了某些内容,则会影响到新建立的对象。

1.添加、删除、修改、遍历、取值

【1】添加、删除、修改、取值

public String getProperty(String key)
用指定的键在此属性列表中搜索属性。如果在此属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回 null。 
public String getProperty(String key, String defaultValue)
用指定的键在属性列表中搜索属性。如果在属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回默认值变量。 
public Object setProperty(String key,String value)
调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
该方法既是添加键值对的方法,也是修改键值对的方法。 
public V remove(Object key)
从哈希表中移除该键及其相应的值。如果该键不在哈希表中,则此方法不执行任何操作。
注意:该方法是从父类继承而来的方法,Properties类本身不提供删除指定键值对的方法。

示例:

 private static void propertiesDemo01() {
Properties p=new Properties();
p.setProperty("01", "zhangsan");
p.setProperty("02", "lisi");
p.setProperty("03", "wangwu"); p.remove("01");
p.list(System.out);
System.out.println(p.getProperty("04"));
System.out.println(p.getProperty("04","赵六"));
}

【2】遍历

public Enumeration<?> propertyNames()
返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。
返回:
属性列表中所有键的枚举,包括默认属性列表中的键。 
public Set<String> stringPropertyNames()
返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。其键或值不是 String 类型的属性被忽略。

返回的 set 不受 Properties 对象支持。对此 Properties 的改变不能在该 set 中反映出来,反之亦然。

返回:
此属性列表中的键集,其中该键及其对应值是字符串,包括默认属性列表中的键。
从以下版本开始:
1.6 

上面两个方法中,第一个方法是不常用的方法,因为该方法的返回值是枚举类型的,而枚举类型现在已经不推荐使用了。所以最常使用的方法就是第二种方法。

stringPropertyNames()方法中到底做了些什么呢?实际上它就是使用枚举类型遍历该集合,然后使用新建立的HashTable对象存储遍历的键值对,最后返回该HashTable对象的keySet方法的返回值。

但是我们应当还有另外一种思路:自定义遍历方法。使用Iterator迭代器遍历集合。

 import java.util.Enumeration;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set; class IT implements Iterator<String>//自定义迭代器
{
Enumeration<String> en;
public IT(Enumeration enumeration)
{
this.en=enumeration;
}
@Override
public boolean hasNext() {
return en.hasMoreElements();
} @Override
public String next() {
return en.nextElement();
}
}
public class PropertiesDemo { public static void main(String[] args) {
propertiesDemo03();
} private static void propertiesDemo03() {
Properties p=new Properties();
p.setProperty("01", "zhangsan");
p.setProperty("02", "lisi");
p.setProperty("03", "wangwu");
IT it=new IT(p.propertyNames());
while(it.hasNext())
{
System.out.println(p.getProperty(it.next()));
}
}

但是我们还有另外一种更好的方式:使用Collections.list方法,可以将枚举类型转换为ArrayList集合。

 private static void propertiesDemo04() {
Properties p=new Properties();
p.setProperty("01", "zhangsan");
p.setProperty("02", "lisi");
p.setProperty("03", "wangwu");
ArrayList<String>list=(ArrayList<String>) Collections.list(p.propertyNames());
Iterator<String>it=list.iterator();
while(it.hasNext())
{
String str=it.next();
System.out.println(str+"="+p.getProperty(str));
}
}

当然这只是两种方法,当然还是它本身提供的stringPropertyNames方法最好。

 private static void propertiesDemo05() {
Properties p=new Properties();
p.setProperty("01", "zhangsan");
p.setProperty("02", "lisi");
p.setProperty("03", "wangwu");
Set<String>set=p.stringPropertyNames();
for(String key:set)
{
System.out.println(key+"="+p.getProperty(key));
}
}

2.list方法。

 void list(PrintStream out)
          将属性列表输出到指定的输出流。
 void list(PrintWriter out)

          将属性列表输出到指定的输出流。

这两个方法对调试很有用,但是应当注意它不能对数据进行其它操作(只用于打印输出)。

我们可以使用

p.list(System.out);

将p中的键值对直接打印到屏幕。

同理,我们可以使用

System.getPropertis.list(System.out);

将本机的信息打印到屏幕上。

3.store方法。

 void store(OutputStream out, String comments)
          以适合使用 load(InputStream)
方法加载到 Properties 表中的格式,将此 Properties
表中的属性列表(键和元素对)写入输出流。
 void store(Writer writer, String comments)

          以适合使用 load(Reader)
方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。

这两个方法正是“Properties 可保存在流中”的体现,它将Properties对象和输出流(字节流和字符流)关联了起来,可以很方便的将数据保存到文件,实现“持久的属性集”。

使用此方法将键值对写入文件的时候,应当注意:不要使用中文,否则会出现乱码。配置文件中,#是注释符号。

private static void propertiesDemo06() throws IOException {
Properties p=new Properties();
p.setProperty("01", "zhangsan");
p.setProperty("02", "lisi");
p.setProperty("03", "wangwu");
FileOutputStream fos=new FileOutputStream("ini.ini");
p.store(fos, "this is Properties information");
fos.close();
}

注意,使用完了流,store方法并不会关闭文件,所以要手动关闭才行。

 #this is Properties information
#Fri Oct 24 11:36:48 CST 2014
03=wangwu
02=lisi
01=zhangsan

ini.ini文件中的内容

4.load方法。

void load(InputStream inStream)
          从输入流中读取属性列表(键和元素对)。
 void load(Reader reader)

          按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。

该方法正是“Properties 可从流中加载”的体现,它将Properties对象和输入流(字节流和字符流)关联了起来,可以很方便的将数据从文件加载到内存,实现对数据的增删改查操作。

比如:将wangwu的年龄改为30,需要各种方法配合使用才行。

原始文件内容:

 zhangsan=23
lisi=24
wangwu=25
zhaoliu=26
chenqi=27
jianba=28

ini.ini文件中的初始内容

 private static void propertiesDemo07() throws IOException {
Properties p=new Properties();
InputStream is=new FileInputStream("ini.ini");
p.load(is);
is.close();
p.setProperty("wangwu","30");
OutputStream os=new FileOutputStream("ini.ini");
p.store(os, "this is properties information");
os.close();
}

代码

 #this is properties information
#Fri Oct 24 11:34:57 CST 2014
jianba=28
chenqi=27
zhangsan=23
lisi=24
zhaoliu=26
wangwu=30

ini.ini文件被修改之后的内容

注意,不要忘了关流,同时FileInputStream和FileOutputStream流不要紧挨在一起定义,否则初始文件会在FileOutputStream对象创建之后被清空。最后的结果只剩下一行。

【JAVA Properties类概述】的更多相关文章

  1. java properties类读取配置文件

    1.JAVA Properties类,在java.util包里,具体类是java.util.properties.Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值 ...

  2. 基于Java Properties类设置本地配置文件

    一.Java Properties类介绍 Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件, ...

  3. Java Properties类

    Properties 是哈希表的一个子类.它是用来维持值列表,其中的键是一个字符串,值也是一个字符串. Properties类被许多其他的Java类使用.例如,它是对象通过System.getProp ...

  4. Java Properties类源码分析

    一.Properties类介绍 java.util.Properties继承自java.util.Hashtable,从jdk1.1版本开始,Properties的实现基本上就没有什么大的变动.从ht ...

  5. java Properties类使用基础

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  6. Java Properties 类读配置文件保持顺序

    前几天,公司项目中有一个需求是读取配置文件的,而且最好能够保证加载到内存中的顺序能够和配置文件中的顺序一致,但是,如果使用 jdk 中提供的 Properties 类的话,读取配置文件后,加载到内存中 ...

  7. Java——File类概述

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  8. 读配置文件能够保持顺序的 Java Properties 类

    序 前几天,公司项目中有一个需求是读取配置文件的.并且最好可以保证载入到内存中的顺序可以和配置文件里的顺序一致,可是.假设使用 jdk 中提供的 Properties 类的话,读取配置文件后.载入到内 ...

  9. java Properties类得到当前的系统属性

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt218 package com.shi.simpleUtil; import  ...

随机推荐

  1. git 教程(9)-远程仓库

    到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题了. 可是有用过集中式版本控制系统SVN的童鞋会站出来说,这些功能在SVN里早就有了,没看出Gi ...

  2. jQuery常用API

    jQuery API查询网址 http://jquery.cuishifeng.cn/ Dom和jquery相互装换 jquery对象[0] => Dom对象 Dom对象 => $(Dom ...

  3. svn下目录说明

    Branch 目录 : 该SVN 的Branch目录下存放的是:跟工程项目相关的各个工程版本分支.该目录下面的版本分支可能会被修改合并.不是稳定的版本. Document 目录:该SVN 的Docum ...

  4. HTML页面关键词随机分布布局

    结合underscore-min.js,和D3.js 绘制HTML关键词随机分布 <!DOCTYPE html> <html> <head> <meta ch ...

  5. 解析JSON插入数据库

    <?php header("Content-Type:text/html;charset=utf-8"); include_once('./mysql.php'); $fil ...

  6. python 模块之间的变量共享

    才疏学浅,只知道两种方式: 1. 通过__builtin__实现: builtin1.py import __builtin__ __builtin__.some_global_var_among_m ...

  7. 数据库视图 (View)和EntityFramework Code First结合使用

    问题来源: 项目需要进行查询操作,会涉及多表间的联合查询,使用Entity Framework会牵涉到效率问题,为增加查询速度,所以使用数据库视图技术,综合来讲是将Model类映射到数据库View. ...

  8. mach 和 array 方法

  9. 【leetcode】Populating Next Right Pointers in Each Node II

    Populating Next Right Pointers in Each Node II Follow up for problem "Populating Next Right Poi ...

  10. poj 2153

    题意:题目还是很简单的,就是求Li Ming 在班上的排名,而且成绩是相加的. 思路:用map就行.不然好像用qsort+二分也可以,不过我在那里碰到了一些状况,然后就没用这种方法了,简单的map就可 ...