【JAVA基础】本地持久化的非数据库方式:properties

时间:2022-05-19 11:23:14

“The Properties class represents a persistent set of properties. The Properties can be saved to a stream or loaded from a stream. Each key and its corresponding value in the property list is a string. “

上面是JDK1.8API文档的java.util.Properties介绍的开头第一句

为什么要用Properties保存数据

Properties属性文件在Java应用程序中是经常可以看得见的,也是特别重要的一类文件。它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数据没有必要使用数据库文件来保存,而使用一般的文本文件来保存,如果是通过File直接保存的话,可能在存储和读取上都不是很方便,但如果保存为Properties文件就不一样了,属性文件都有键值对应的,在JAVA的包中,有提供专门的操作属性文件的类。这个类就是 java.uitl.Properties类,由于Properties类是一个集合类,所以,Properties会将属性以集合的方式读写。

如何使用Properties保存数据

Properties继承自HashTable类,采用键值对应的形式存储数据。Properties有专门的方法读写properties文件。

//读取属性文件流的方法 
public void load(InputStream inStream) throws IOException {}      
//写属性文件流的方法 
public void store(OutputStream out, String comments) throws IOException {}

假定我们建立了一个my.properties文件,并在文件中写入如下代码。

jmx=63922
merId=1432342
name=\u6768\u5E06

(需要注意的一点,在里面汉字需要转化为对应的unicode编码)

Properties prop = new Properties();  //创建properties对象
InputStream in = new FileInputStream("conf/my.properties"); //将文件变成文件流
prop.load(in);  //core 讲流load进

如果需要读取一个属性,因为属性文件中的每一行都是一个键值对应,所以每一行都代表了一个属性对象,每一行都将以键和值的关系存储到Properties中,Properties类提供了getProperty(String key)方法用来通过键名读取键值,当key在属性集合中找不到时又想为key在程序中赋予一个值时可以使用public String getProperty(String key, String defaultValue)方法,这个方法的意思就是用指定的键在属性列表中搜索属性。如果在属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回默认值变量:

//获取属性值,name已在文件中定义      
System.out.println("获取属性值:name=" + prop.getProperty("name")); 
//获取属性值,country未在文件中定义,将在此程序中返回一个默认值,但并不修改属性文件      
System.out.println("获取属性值:country=" + prop.getProperty("country", "中国")); 

在知道怎么读取属性文件之后我们还有一个很重要的事情就是要修改和添加新的属性到属性文件,这里就是使用public void store(OutputStream out, String comments)方法,这个方法是将属性集合写到一个OutputStream流中,同InputStream流一样,这里同样是使用其子类 FileOutputStream(String name),这里就不多说了。

在调用store这个方法之前,我们要修改或者添加新的属性到属性集合,这里使用方法setProperty(String key ,String value),这个方法就是当属性集合中存在指定的key时,就修改这个key的值,如果不存在,就新建一个key,同样是通过键值关系保存的,但值得注意的是,Properties类继承自Hashtable,所以也可以用Hashtable的put和putAll方法保存,但强烈反对使用这两个方法,因为它们允许调用方插入其键或值不是 Strings 的项。相反,应该使用 setProperty 方法。如果在“有危险”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。那好,下面我们就来看看修改、添加和保存属性的程序:

//修改name的属性值 
prop.setProperty("name", "Vermouth");   
//添加一个新的属性studio 
prop.setProperty("studio", "Boxcode Studio");   
//文件输出流 
FileOutputStream fos = new FileOutputStream("conf/my.properties");  //相对路径 
prop.store(fos, "Copyright (c) Boxcode Studio"); //保存到properties文件里 后面的参数会加在properties文件的首行
fos.close();//关闭流