一、概述。

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

  1. 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的内容(无论增删),这样可能就会出现一些怪现象。

  1. private static void propertiesDemo01() {
  2. Properties p=new Properties();
  3. p.setProperty("01", "zhangsan");
  4. p.setProperty("02", "lisi");
  5. p.setProperty("03", "wangwu");
  6. Properties pp=new Properties(p);
  7.  
  8. pp.remove("01");
  9. System.out.println(pp.getProperty("01"));
  10. System.out.println(p.getProperty("01"));
  11.  
  12. p.remove("01");
  13. System.out.println(p.getProperty("01"));
  14. System.out.println(pp.getProperty("01"));
  15. }

该段代码的执行结果是:

  1. zhangsan
  2. zhangsan
  3. null
  4. null

执行结果

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

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

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

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

示例:

  1. private static void propertiesDemo01() {
  2. Properties p=new Properties();
  3. p.setProperty("01", "zhangsan");
  4. p.setProperty("02", "lisi");
  5. p.setProperty("03", "wangwu");
  6.  
  7. p.remove("01");
  8. p.list(System.out);
  9. System.out.println(p.getProperty("04"));
  10. System.out.println(p.getProperty("04","赵六"));
  11. }

【2】遍历

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

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

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

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

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

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

  1. import java.util.Enumeration;
  2. import java.util.Iterator;
  3. import java.util.Properties;
  4. import java.util.Set;
  5.  
  6. class IT implements Iterator<String>//自定义迭代器
  7. {
  8. Enumeration<String> en;
  9. public IT(Enumeration enumeration)
  10. {
  11. this.en=enumeration;
  12. }
  13. @Override
  14. public boolean hasNext() {
  15. return en.hasMoreElements();
  16. }
  17.  
  18. @Override
  19. public String next() {
  20. return en.nextElement();
  21. }
  22. }
  23. public class PropertiesDemo {
  24.  
  25. public static void main(String[] args) {
  26. propertiesDemo03();
  27. }
  28.  
  29. private static void propertiesDemo03() {
  30. Properties p=new Properties();
  31. p.setProperty("01", "zhangsan");
  32. p.setProperty("02", "lisi");
  33. p.setProperty("03", "wangwu");
  34. IT it=new IT(p.propertyNames());
  35. while(it.hasNext())
  36. {
  37. System.out.println(p.getProperty(it.next()));
  38. }
  39. }

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

  1. private static void propertiesDemo04() {
  2. Properties p=new Properties();
  3. p.setProperty("01", "zhangsan");
  4. p.setProperty("02", "lisi");
  5. p.setProperty("03", "wangwu");
  6. ArrayList<String>list=(ArrayList<String>) Collections.list(p.propertyNames());
  7. Iterator<String>it=list.iterator();
  8. while(it.hasNext())
  9. {
  10. String str=it.next();
  11. System.out.println(str+"="+p.getProperty(str));
  12. }
  13. }

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

  1. private static void propertiesDemo05() {
  2. Properties p=new Properties();
  3. p.setProperty("01", "zhangsan");
  4. p.setProperty("02", "lisi");
  5. p.setProperty("03", "wangwu");
  6. Set<String>set=p.stringPropertyNames();
  7. for(String key:set)
  8. {
  9. System.out.println(key+"="+p.getProperty(key));
  10. }
  11. }

2.list方法。

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

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

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

我们可以使用

  1. p.list(System.out);

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

同理,我们可以使用

  1. 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对象和输出流(字节流和字符流)关联了起来,可以很方便的将数据保存到文件,实现“持久的属性集”。

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

  1. private static void propertiesDemo06() throws IOException {
  2. Properties p=new Properties();
  3. p.setProperty("01", "zhangsan");
  4. p.setProperty("02", "lisi");
  5. p.setProperty("03", "wangwu");
  6. FileOutputStream fos=new FileOutputStream("ini.ini");
  7. p.store(fos, "this is Properties information");
  8. fos.close();
  9. }

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

  1. #this is Properties information
  2. #Fri Oct 24 11:36:48 CST 2014
  3. 03=wangwu
  4. 02=lisi
  5. 01=zhangsan

ini.ini文件中的内容

4.load方法。

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

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

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

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

原始文件内容:

  1. zhangsan=23
  2. lisi=24
  3. wangwu=25
  4. zhaoliu=26
  5. chenqi=27
  6. jianba=28

ini.ini文件中的初始内容

  1. private static void propertiesDemo07() throws IOException {
  2. Properties p=new Properties();
  3. InputStream is=new FileInputStream("ini.ini");
  4. p.load(is);
  5. is.close();
  6. p.setProperty("wangwu","30");
  7. OutputStream os=new FileOutputStream("ini.ini");
  8. p.store(os, "this is properties information");
  9. os.close();
  10. }

代码

  1. #this is properties information
  2. #Fri Oct 24 11:34:57 CST 2014
  3. jianba=28
  4. chenqi=27
  5. zhangsan=23
  6. lisi=24
  7. zhaoliu=26
  8. 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. Android架构:用消息机制获取网络数据

    网络请求,不管是什么协议,是长连接还是短连接,总是一个异步的请求,过程包括:加请求参数->发起请求->接收响应->解析数据->获得业务数据. 最挫的做法是,业务代码包揽所有这些 ...

  2. 网络数据包发送工具PacketSender中文源码

    在网上发现了一个好用的工具PacketSender,数据包发送器.对于写网络程序来说,有很大的便利性.虽然在linux下,netcat工具也很好用,但是这个也不错. 原本是英文的,给翻译了一下.这是基 ...

  3. zencart安装后修改configure.php权限

    刚安装完zencart的时候,打开前台页面会遇到下面的安全提示: “警告: 配置文件允许写入: E:\upupw\htdocs\mysite\includes\configure.php,存在安全隐患 ...

  4. django xadmin自定义菜单

    1. 自定义菜单 adminx.py class GlobalSetting(object): site_title = u'xxx后台' def kuF_site_menu(self): retur ...

  5. faac编码aac

    // faacode.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <faac.h> #include &l ...

  6. iOS drawRect 和 awakeFromNib

    今天想在一个view上绘制一个虚线边框,百度到的代码如下: CAShapeLayer *borderLayer = [CAShapeLayer layer]; borderLayer.frame = ...

  7. Java实验四和实验五

    实验四 类的继承性和多态性 [开发语言及实现平台或实验环境] Windows2000 或XP,JDK1.6与Jcreator4.0 [实验目的] 1.  掌握OOP方式进行程序设计的方法, 2.  了 ...

  8. ACM/ICPC 之 模拟 (HNUOJ 13391-换瓶模拟)

    题意:汽水瓶有三个部分cap+plastic bottle+ label(瓶盖-瓶身-瓶底),给出数据:n为原瓶数,x,y,z为这三个部分可以用相应的数字换取新瓶子,求最大总瓶数. 模拟(暴力) // ...

  9. Java for LeetCode 209 Minimum Size Subarray Sum

    Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...

  10. jQuery 调用jsonp实现与原理

    jQuery 调用jsonp实现与原理 您的评价:        收藏该经验     阅读目录 1.客户端代码 2.服务器端 通过jQuery实现JSONP 一般的ajax是不能跨域请求的,因此需要使 ...