黑马程序员------IO流和MAP的联合 properties (一般用于配置文件)

/**
 * properties是hashtable的子类 哈希表hashtable 也就是说它具备map集合的特点,
 * 而且它里面存储的键值对 都是字符串。
 * 
 * 是结合中IO技术相结合的集合容器
 * 
 * 该对象的特点:可以用于键值对形式的配置文件
 * 
 * 有固定格式 
 * 	键=值
 * 
 * 例如: 背景 = 红色
 * 
 * 文字 = 蓝色 等
 * 
 * @author Administrator
 * 
 */
import java.util.*;

public class PropertiesDemo
{
    public static void main(String[] args)
    {
	setAndGet();
    }

    // 设置 获取 元素

    public static void setAndGet()
    {
	// 创建properties对象
	Properties prop = new Properties();

	// 对键和值进行设置
	prop.setProperty("zhangsan", "20");
	prop.setProperty("lisi", "30");

	// System.out.println(prop);

	// 对键进行获取 返回此属性列表中的键集,
	// 其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,
	// 则还包括默认属性列表中不同的键。
	Set<String> name = prop.stringPropertyNames();// 现在所有的名字在集合name中

	for (String s : name)
	{
	    // 循环输出由键 找到的值
	    System.out.println(s + "::" + prop.getProperty(s));
	}

    }

}

*************************************************************************************************************************************************************************************



*************************************************************************************************************************************************************************************


第二个例子:

/**
 * 演示,: 如何将流中的数据存储到集合中:
 * 需求:将info.txt中的键值对,存入到properties集合中
 * 
 * 思路:
 * 	1,用一个流和info.txt关联;
 * 	2,读取一行数据,将改行数据用"="进行切割
 * 	3,等号左边作为键,右边作为值,存入到properties集合中
 * @author Administrator
 *
 */
import java.io.*;
import java.util.*;

public class PropertiesDemo2
{
    public static void main(String[] args) throws IOException// 为了代码的可看性 这里就抛出异常
    {
	// method_1();
	loadDemo();

    }

    public static void loadDemo() throws IOException
    {
	// 创建properties对象
	Properties prop = new Properties();

	// 使用流 关联文件 这里使用字节流
	FileInputStream fis = new FileInputStream("info.txt");

	// 使用load方法 ,将流中数据加载进入集合
	prop.load(fis);

	// 现在要改变集合的同时也要改变文件中的内容
	prop.setProperty("zhaoliu", "99");// 这里只改变了内存中的数据没有改变文件

	// 创建写入文件流
	FileOutputStream fos = new FileOutputStream("info.txt");

	// store方法 将此 Properties 表中的属性列表(键和元素对)写入输出流。
	//实际上就是将集合中内容写入文件
	prop.store(fos, "zhushi");

	// 打印集合中元素 键值对都打印
	// System.out.println(prop);
	// 另一种打印方法 list 数是打印流 列出集合目录
	prop.list(System.out);

	// 关闭流文件
	fis.close();
	fos.close();

    }

    // 下面的代码 是load方法的原理
    public static void method_1() throws IOException// 为了代码的可看性 这里就抛出异常
    {
	// 使用读取缓冲流 用一个流和info.txt进行关联 字符流
	BufferedReader bufr = new BufferedReader(new FileReader("info.txt"));

	// 读取一行中的数据 中转
	String line = null;

	// 这里定义properties对象 键值对形式
	Properties prop = new Properties();

	// 循环读取一行 前面IO的知识
	while ((line = bufr.readLine()) != null)
	{
	    // 读取一行后打印
	    // System.out.println(line);
	    // 对一行进行切割 (根据等号) 并把切割后的数据传给数组
	    String[] arr = line.split("=");

	    // 设置properties中的数据
	    prop.setProperty(arr[0], arr[1]);

	}

	// 关闭流
	bufr.close();

	// 打印prop集合中数据
	System.out.println(prop);
    }

}


*****************************************************************************************************************************************************************************************


第三个例子:

/**
 * 需求:用于记录应用程序运行次数
 * 如果使用次数已到。那么给出注册提示。
 * 
 * 分析:
 * 容易想到的是计数器, 可是计数器定义在程序中,随着程序的运行而在内存
 * 中存在,并进行自增,可是随着程序的退出,该计数器也在内存中消失了。
 * 
 * 下一次再启动该程序,有重新开始从0技术。
 * 这不是想要的。
 * 
 * 需要程序即使结束,该计数器的值也存在。
 * 下次程序启动会先加载该计数器的值并加1后再重新存储起来。
 * 
 * 所以要建立一个配置文件,用于记录该软件的使用次数
 * 
 * 该配置文件使用键值对的形式,这样
 * 便于月度数据,并且操作数据
 * 
 * 键值对数据时map集合。
 * 数据时以文件形式存储,那么就使用IO技术
 * map + IO 就要使用Properties
 * 
 * 配置文件可以实现应用程序数据的共享
 * @author Administrator
 *
 */
import java.io.*;
import java.util.*;

public class PropertiesDemo4
{
    public static void main(String[] args) throws IOException
    {
	// 创建properties对象
	Properties prop = new Properties();

	// 封装文件对象 //文件为count.ini
	File file = new File("count.ini");

	// 判断文件是否存在
	if (!file.exists())
	{
	    // 如果不存在那么建立这个文件
	    file.createNewFile();
	}

	// 创建读取流对象
	FileInputStream fis = new FileInputStream(file);

	// 加载配置文件count.ini 这里封装成了对象 file
	prop.load(fis);

	// 定义计数器
	int count = 0;

	// 获取使用的次数
	String value = prop.getProperty("time");

	// 判断能否拿到使用次数的值
	if (value != null)
	{
	    // 将获取的使用次数的值赋值给count
	    // 因为properties集合中都是字符串所以要强制转换
	    count = Integer.parseInt(value);

	    // 如果超过使用次数,给出提示,并返回
	    if (count >= 4)
	    {

		System.out.println("已经达到使用次数限制,请注册");
		return;
	    }
	}

	// 运行一次后 计数器自增+-
	count++;

	// 设置内存中容器的 键值对 count现在是整形 要转换成字符串
	prop.setProperty("time", count + "");

	// 创建写入流对象 用于写入文件 操作的文件对象时file
	// 实际上是"count.ini
	FileOutputStream fos = new FileOutputStream(file);

	// 将集合中内容写入文件
	prop.store(fos, " ");
    }

}




你可能感兴趣的:(黑马程序员------IO流和MAP的联合 properties (一般用于配置文件))