一、Properties类是什么样的一个类?
我们知道:经过查阅我们知道:Properties是hashtable的子类,具备了map集合的特点:
1.它里面存放的键值对全部是字符串,键值全部都是String类型
2.它不具备泛型
二、存储这样仅为String类型的键值对,有什么具体的作用呢?
是集合中和IO技术相结合的一个重要容器,它最大的作用就是:它具备的这些键值对内容,可以作为配置文件
三、那么具体怎样来存放这些基本的键值对呢?
下面是一个具体的步骤,首先怎样添加这些键值对信息?
1.涉及到了添加键值对;
2.改变键所对应的value值的信息的方法;
3.怎样简洁快速高效地取出该map集合中的元素
方式:通过高级for循环和常规的迭代器遍历的方法
【注意】取出元素:因为是map集合,所以必须先要把键装入set集合中之后,才能
得到相应的value值
实例分析:
import java.util.*;
class PropertiesDemo1
{
public static void main(String[] args)
{
setAndGet();
}
public static void setAndGet()
{
Properties pro=new Properties();
pro.setProperty("wang","28");
pro.setProperty("jiejie","2");
System.out.println(pro); //打印出来:默认的格式:{jiejie=2, wang=28}
//当我再一次设置时,这时候我们改变会改变键wang具体的value值:
pro.setProperty("wang","20");
//通过该集合的自身方法:getgetProperty(键),能够获得其对应的value值
System.out.println(pro.getProperty("wang")); //结果是:20
//得到集合中全部的键值对:
//1.当然有map转变为set集合之后,也可以用迭代的方式遍历,
//2.下面我们用的高级循环去做,这样简洁快速
Set<String> ss=pro.stringPropertyNames();
for (String s: ss)
{
System.out.println(s+"::"+pro.getProperty(s));
}
//之前我们在学习集合中遍历元素都是用迭代器的方式取出元素:
Iterator<String> is=ss.iterator();
while (is.hasNext())
{
String key=is.next();
String value=pro.getProperty(key);
System.out.println(key+":::"+value);
}
}
}
四、我们怎样把这些键值对的信息存在一个配置文件中呢,这里先以存入txt文件为例,因为这个大家都比较熟悉?
上述:我们只是把基本的键值对添加到了内存中,没有没有添加到相应的配置文件中,下面:
我们通过字节流的方法来先具体的txt文件中添加基本的键值对信息:
/*
把基本的键值对信息存入到相应的txt文件中:
分析步骤;
1.定义一个FileInputStream流和txt相关联,主要是为了让系统启动时能够读到该配置的数据
2.建立Propertes集合
3.用该集合的load方法随着系统的加载而把第1中读取流关联起来
4.向集合中添加进入键值对元素;
5.创建一个FileOutputStream流与txt关联,主要是为了把内容写入txt文件中,
6.这时候的键值对,是在内存的集合中存在,需要进一步用集合的store方法将内容保存在txt中
,用该方法可以与第5中的流对象关联起来。
7.关闭流
【注意】:系统默认识别的配置文件,也就是上述说到的txt文件,其内容中是固定的格式:
键=值 所以在读取,并且修改的时候要注意这一点。
*/
import java.io.*;
import java.util.*;
class PropertiesDemo2
{
public static void main(String[] args) throws IOException
{
writeTxt();
//readTxt();
}
//这里就是添加进入相应元素的具体方法:
public static void writeTxt() throws IOException
{
//1.用输入流关联到要写入键值对信息的txt文件
//FileInputStream fis=new FileInputStream("wang.txt");
//小插曲:当然如果这个文件不存在,自己先创建一个就OK了
File file=new File("wang.txt"); //.ini就是配置文件2015-4-15
if (!file.exists())//刚开始如果文件不存在就创建就OK了
file.createNewFile();
FileInputStream fis=new FileInputStream(file);
//2.创建该集合:
Properties pro=new Properties();
//3.让系统加载到该文件
pro.load(fis);
//4.添加数据到内存中:
pro.setProperty("wang","28");
pro.setProperty("lu","26");
pro.setProperty("jie","3");
//5创建文件输出流与txt文件关联起来:
FileOutputStream fos=new FileOutputStream("wang.txt");
//6.把数据真正的写到一个wang.txt文件中:
String comments="";//这里只是一个注释而已,不写内容也行,要作为参数传递的
pro.store(fos,comments);
//7.关闭流:
fis.close();
fos.close();
}
}
//这样就完成了:可以找到wang.txt文件去看一下内容:是不是要求的内容!
五、那么具体怎样取出键值对,来进行修改呢?
下面我写了一个简单的例子:从配置文件中读取出数据,进行相应的修改:
就是例如上述的实例;我们要改变“lu=26”,变成“lu=22”怎么办?
原理很简单,
1.先把数据都读到集合中,
2.直接把“lu=26”,从新设置就ok了,不用取出操作,因为Properties中的方法setProperty();已经是封装好的了,直接找到键重新设置就行;
3.设置完之后,用store的方法直接重新保存在txt文件就行
废话不多说:上代码了:
import java.io.*;
import java.util.*;
class PropertiesDemo3
{
public static void main(String[] args) throws IOException
{
modifyTxt();
}
//修改的方法:
public static void modifyTxt() throws IOException
{
//1.用输入流关联到要写入键值对信息的txt文件,这时候txt文件是存在的了
//我们要做的是取值修改:
FileInputStream fis=new FileInputStream("wang.txt");
//2.创建该集合:
Properties pro=new Properties();
//3.让系统加载到该文件
pro.load(fis);
//4.添加数据修改到内存中:把lu=26 改成lu=22;
pro.setProperty("lu","22");
//5创建文件输出流与txt文件关联起来:
FileOutputStream fos=new FileOutputStream("wang.txt");
//6.把数据真正的写到一个wang.txt文件中:
String comments="modify,lu=22";
pro.store(fos,comments);
//7.关闭流:
fis.close();
fos.close();
}
}
运行结果去txt文件中看看:
六、下面我们做一个综合实例看深入了解一下Properties的具体特点:
这其实就是老师讲的一个重要实例:在现实生活中,我们知道:有一些软件是有一定的免费试用次数,当免费次数完成了我们就无法再用了,其中会提示我们注册交钱,在继续使用!
其实:很容易想到的是有一个计数器
该计数器定义在程序中,随着程序的运行而在内存中存在,并且自增
可是随着该应用程序的推出,该计数器也在内存中消失了。
下一次启动程序,又会从0开始,这样就不没有效果了
所以:想到了配置文件,用于记录该软件的使用次数,次数到了,就over了,提示注释
配置文件中也一样用兼职对的形式存储,这样方法查看
所以也要用到map+IO技术,把使用的次数写入配置文件中,并且配置文件能够实现应用程序的
共享!话不多说:
直接进入代码分析:
import java.io.*;
import java.util.*;
class PropertiesDemo3
{
public static void main(String[] args) throws Exception
{
Properties pro=new Properties();//建立一个map集合
File file=new File("count.ini"); //.ini就是配置文件
if (!file.exists())//刚开始如果文件不存在就创建就OK了
file.createNewFile();
FileInputStream fis=new FileInputStream(file); //读取流关联配置文件
pro.load(fis); //跟随系统一块加载!
String value=pro.getProperty("time"); //获取键time对应的值
int count=0;
if (value!=null)
{
count=Integer.parseInt(value);//把String类型的value值变成Integer类型
if (count>=5)
{
System.out.println("免费试用结束,如需继续使用,请注册吧!");
return;
}
}
count ++;
pro.setProperty("time",count+"");
//count+""是因为要的是字符串
//把每一次使用的次数又更该在内存中,最后
//通过store方法,把配置文件中的内容改掉就行!
FileOutputStream fos=new FileOutputStream(file);
pro.store(fos,"");
fos.close();
fis.close(); //记得关闭流
}
}
第一次运行时,会产生一个配置文件:
其中的内容是:
接着运行5次时,提示注册信息了,看看配置文件吧!