Java基础知识IO流(Properties)

时间:2021-08-09 15:29:40

Properties概述

Properties类是hashtable的子类,它具备map集合的特点,而且它里面存储的键值对都是字符。Properties 可保存在流中或从流中加载。
Properties是集合和IO技术相结合的集合容器。
Properties 类表示了一个持久的属性集,可以用于键值对形式的配置文件,在加载数据时,需要数据有固定格式:键=值。
比如软件的配置文件:软件的配置信息和数据进行了持久化存储,将配置信息存储到一个文件当中,即配置文件,软件每次打开时,加载配置文件。操作配置文件需要IO流技术。

Properties方法摘要

方法摘要
String getProperty(String key)
用指定的键在此属性列表中搜索属性。
String getProperty(String key, String defaultValue)
用指定的键在属性列表中搜索属性。
void list(PrintStream out)
将属性列表输出到指定的输出流。
void list(PrintWriter out)
将属性列表输出到指定的输出流。
void load(InputStream inStream)
从输入流中读取属性列表(键和元素对)。
void load(Reader reader)
按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
void loadFromXML(InputStream in)
将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。
Object setProperty(String key, String value)
调用 Hashtable 的方法 put。
void store(OutputStream out, String comments)
以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。
void store(Writer writer, String comments)
以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。
void storeToXML(OutputStream os, String comment)
发出一个表示此表中包含的所有属性的 XML 文档。
void storeToXML(OutputStream os, String comment, String encoding)
使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。
Set stringPropertyNames()
返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。

Properties存取配置文件

若配置文件已经存在,想要将配置文件中的键值数据存到集合中进行操作,如何实现?
step1:用一个流和配置文件关联;
step2:读取一行数据,将该行数据用”=“进行切割;
step3:等号左边作为键,等号右边作为值,存入到Properties集合中即可。

import java.io.*;
import java.util.*;

class TestProperties
{
public static void main(String[] args) throws IOException
{
method_1();
}
public static void method_1() throws IOException
{
BufferedReader bfr=null;
Properties pro=new Properties();
try
{
bfr=new BufferedReader(new FileReader("config.txt"));
String line=null;
while((line=bfr.readLine())!=null)
{
String[] kv=line.split("=");
pro.setProperty(kv[0],kv[1]);
}

System.out.println(pro);
}
catch (IOException e)
{
throw e;
}
finally
{
try
{
if(bfr!=null)
{
bfr.close();
}
}
catch (IOException e)
{
throw e;
}
}

}

}

Java基础知识IO流(Properties)
Java基础知识IO流(Properties)
以上的代码其实就是Properties的load(Reader r )的原理,Properties自身提供load(InputStream i)或load(Reader r)从字节流或者字符流中读取属性列表

    public static void loadDemo()throws IOException
{
Properties pro=new Properties();
FileInputStream fis=new FileInputStream("config.txt");
pro.load(fis);
pro.list(System.out);
}

Java基础知识IO流(Properties)

Properties不光可以加载配置文件中的信息到集合中,也可以将集合中的数据保存到指定的文件中
当对属性列表中的值进行修改时,可以使用Properties的setProperty(String key,String value)方法进行修改,但是这种修改只是修改了内存中的值即Properties的对象中的值,而硬盘上文件的值没有改变。store()方法可以将内存的结果存到流当中,然后保存在文件中。
另:文件中#开头的内容是注释信息,不会被Properties加载,Properties加载的是键值对。

    public static void loadDemo()throws IOException
{
Properties pro=new Properties();
FileInputStream fis=new FileInputStream("config.txt");
pro.load(fis);
pro.list(System.out);
System.out.println("*****************************");
pro.setProperty("name","shanshan");
FileOutputStream fos=new FileOutputStream("config.txt");
pro.store(fos,"zhushi");
fis.close();
fos.close();
pro.list(System.out);
}

Java基础知识IO流(Properties)

Properties练习

要求:记录应用程序运行次数,如果使用次数已到,那么给出注册提示。
很容易想到计数器,但是计数器是定义在程序中的,随着程序的运行而在内存中存在,并且进行自增,可是随着程序的推出,该计数器也在内存中消失了,下次再启动程序时,又重新开始从0计数。

想要达到程序即使结束,该计数器的值也存在,下次程序启动时会先加载该计数器的值,并加1后再重新存储起来的效果,就需要建立一个配置文件,用于记录该软件的使用次数。
该配置文件使用键值对的形式,这样便于阅读数据,并操作数据。

键值对数据是map集合,数据是以文件形式存储,使用io技术。
那么map+io –>properties.
配置文件可以实现应用程序数据的共享。

配置文件有.xml和.properties

//这是模拟xml的配置文件
<Persons>
<Person id="01">
<name>zhangsan</name>
<age>20</age>
</Person>
<Person id="02">
<name>Lisi</name>
<age>20</age>
</Person>
<Person id="03">
<name>Wangwu</name>
<age>20</age>
</Person>
</Persons>

对于xml文件,java有专门的类可以解析,Document类的对象可以获取xml的数据,但是操作起来比较麻烦,所以有一个dom4j(dom for java)专门用来解析xml。

import java.io.*;
import java.util.*;

class TestCount
{

public static void main(String[] args) throws IOException
{
Properties pro=new Properties();
File file=new File("usetimes.txt");
if(!(file.exists()))
{
file.createNewFile();
}

FileInputStream fis=new FileInputStream(file);
pro.load(fis);
int count=0;
String time =pro.getProperty("count");
if(time!=null)
{
count=Integer.parseInt(time);
if(count>=5)
{
System.out.println("please registe");
fis.close();
return;
}
}
count++;

pro.setProperty("count",String.valueOf(count));
FileOutputStream fos=new FileOutputStream(file);
pro.store(fos,"haha");

fis.close();
fos.close();
}
}