【JAVA Properties类概述】
一、概述。
之前说过,该对象是和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)
|
public String getProperty(String key, String defaultValue)
|
public Object setProperty(String key,String value)
|
public V remove(Object key)
|
示例:
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()
|
上面两个方法中,第一个方法是不常用的方法,因为该方法的返回值是枚举类型的,而枚举类型现在已经不推荐使用了。所以最常使用的方法就是第二种方法。
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类概述】的更多相关文章
- java properties类读取配置文件
1.JAVA Properties类,在java.util包里,具体类是java.util.properties.Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值 ...
- 基于Java Properties类设置本地配置文件
一.Java Properties类介绍 Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件, ...
- Java Properties类
Properties 是哈希表的一个子类.它是用来维持值列表,其中的键是一个字符串,值也是一个字符串. Properties类被许多其他的Java类使用.例如,它是对象通过System.getProp ...
- Java Properties类源码分析
一.Properties类介绍 java.util.Properties继承自java.util.Hashtable,从jdk1.1版本开始,Properties的实现基本上就没有什么大的变动.从ht ...
- java Properties类使用基础
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- Java Properties 类读配置文件保持顺序
前几天,公司项目中有一个需求是读取配置文件的,而且最好能够保证加载到内存中的顺序能够和配置文件中的顺序一致,但是,如果使用 jdk 中提供的 Properties 类的话,读取配置文件后,加载到内存中 ...
- Java——File类概述
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- 读配置文件能够保持顺序的 Java Properties 类
序 前几天,公司项目中有一个需求是读取配置文件的.并且最好可以保证载入到内存中的顺序可以和配置文件里的顺序一致,可是.假设使用 jdk 中提供的 Properties 类的话,读取配置文件后.载入到内 ...
- java Properties类得到当前的系统属性
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt218 package com.shi.simpleUtil; import ...
随机推荐
- U盘安装中标麒麟服务器操作系统 一 (NeoKylin 6.5)
U盘安装中标麒麟服务器操作系统(NeoKylin 6.5) 首先需要下载中标麒麟服务器操作系统的iso镜像.我这里的是NeoKylin Linux A 6.5.iso 因为超过了4GB,百度网盘不支持 ...
- HTML页面关键词随机分布布局
结合underscore-min.js,和D3.js 绘制HTML关键词随机分布 <!DOCTYPE html> <html> <head> <meta ch ...
- mysql 同步
http://dev.mysql.com/doc/refman/5.5/en/replication-howto.html http://blog.csdn.net/mycwq/article/det ...
- 【实例】html5-canvas中实现背景图片的移动
本例来自于<HTML5 Canvas核心技术 图形.动画与游戏开发> 在线演示 (图有点多,请多刷新几次) 本例还有一点代码不理解,我用注释和问号标注出来了,有大神看到求解答,谢谢 本例子 ...
- NUI四种提交数据方式c
方式一: 1)前端页面 2)逻辑流参数设置 方式二: 1)前端页面 2)逻辑流参数设置 方式三: 1)前端页面 2)逻辑流参数设置 方式四: 1)前端页面 2)逻辑流参数设置
- C#之系统自带保存属性
源代码下载链接 程序开发很多时候需要根据运行环境做不通的参数配置,通过写ini之类的文本文件是一种方法,但这种方法也同时会把数据暴露 Winform开发中可以将需要配置的字段属性保存到程序中(其实也是 ...
- 1.把二元查找树转变成排序的双向链表[BST2DoubleLinkedList]
[题目]:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树 . 10 / \ 6 14 / \ / \ 4 8 12 16 转 ...
- linux学习之lvm-逻辑卷管理器
一.简介 lvm即逻辑卷管理器(logical volume manager),它是linux环境下对磁盘分区进行管理的一种机制.lvm是建立在硬盘和分区之上的一个逻辑层,来提高分区管理的灵活性.它是 ...
- std::map
1.例: map<int,string> m_mapTest; m_mapTest.insert(make_pair(1,"kong")); m_mapTest.ins ...
- 1.openstack之mitaka搭建基本配置
介绍:本次案列为基本的三节点部署 注:搭建所需要的包可以联系QQ:22102107获取 一:网络: 1.管理网络:192.168.11.0/24 2.数据网络:1.1.1.0/24 注:每个节点两个网 ...