1. 首页
  2. Java基础

056-五十六、Java之Properties及对象序列化

Properties 介绍

Properties 是在java.util包中,该类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。

因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用 putputAll 方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。

相反,应该使用setProperty 方法。如果在“不安全”的 Properties 对象(即包含非 String 的键或值)上调用 storesave 方法,则该调用将失败。

类似地,如果在“不安全”的 Properties 对象(即包含非 String 的键)上调用propertyNameslist 方法,则该调用将失败。一般Properties 文件是一个配置文件。

构造方法

Properties()
创建一个无默认值的空属性列表。
Properties(Properties defaults)
创建一个带有指定默认值的空属性列表。

常用方法

load(InputStream inStream)
从输入流中读取属性列表(键和元素对)。

setProperty(String key, String value)
调用 Hashtable 的方法 put

store(OutputStream out, String comments)
以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。

getProperty(String key)
用指定的键在此属性列表中搜索属性。

clear()
将此哈希表清空,使其不包含任何键。

创建temp.properties文件

在掩饰方法之前我们需要先创建一个后缀为properties的文件,文件名就叫做temp.properties吧。这个时候需要用到File类了。


/** * 在程序目录下创建一个temp.properties文件 */ File dirPath = new File("."); //创建一个储存文件temp.properties文件的绝对路径 String filePath = dirPath.getCanonicalPath() + "\\src\\temp.properties"; //开始创建文件 File file = new File(filePath); //创建文件 boolean bool = file.createNewFile(); System.out.println(bool); //在当前程序下的src文件夹下成功创建了一个temp.properties文件 结果:true

load,setProperty,store

在写入配置文件内容需要使用到load,setProperty,store方法


** * 在程序目录下创建一个temp.properties文件 */ File dirPath = new File("."); //创建一个储存文件temp.properties文件的绝对路径 String filePath = dirPath.getCanonicalPath() + "\\src\\temp.properties"; //创建properties对象 Properties properties = new Properties(); //加载temp.properties文件 properties.load(new FileInputStream(filePath)); //设置数据 properties.setProperty("1","zhangsan"); properties.setProperty("2","lisi"); properties.setProperty("3","wangwu"); //将数据保存到文件中 properties.store(new FileOutputStream(filePath),"This is properties file!!!"); //temp.properties文件中的内容。 #This is properties file!!! #Fri Apr 13 14:31:53 CST 2018 =wangwu =lisi =zhangsan

getProperty(String key)

用指定的键在此属性列表中搜索属性。


System.out.println(properties.get("1")); 结果:zhangsan

clear()

将此哈希表清空,使其不包含任何键。


properties.clear();//清空数据 System.out.println(properties.get("1"));//再次获取就是null了 结果:null

对象的序列化与反序列化

序列化为将对象的信息存储到文件中,反序列化为将文件存储的对象信息读取出来。

ObjectOutputStream(对象序列化)

ObjectOutputStreamJava 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。

如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。只能将支持 java.io.Serializable 接口的对象写入流中。

每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。

ObjectInputStream(对象反序列化)

ObjectInputStream 确保从流创建的图形中所有对象的类型与 Java 虚拟机中显示的类相匹配。使用标准机制按需加载类。

只有支持 java.io.Serializablejava.io.Externalizable 接口的对象才能从流读取。

下面我们就不再讲述了,前面章节已经讲过io流的一些类的使用了。大致api的使用都差不多。这里就直接代码演示了。

代码演示

首先创建一个实体类实现Serializable接口,该接口只是一个序列化的标记接口。


class Person implements Serializable { private String name; private int id; public Person() { } public Person(String name, int id) { this.name = name; this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } }

然后实现序列化和反序列化的代码。


** * 在程序目录下创建一个temp.properties文件 */ File dirPath = new File("."); //创建一个储存文件temp.properties文件的绝对路径 String filePath = dirPath.getCanonicalPath() + "\\src\\temp.properties"; //创建一个序列化对象 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath)); //这里需要序列化对象,所以使用writeObject方法 oos.writeObject(new Person("张三",1));//写入第一个对象 oos.writeObject(new Person("李四",2));//写入第二个对象 oos.writeObject(new Person("王五",3));//写入第三个对象 //关闭资源 oos.close(); //创建一个反序列化对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath)); Person p1 = (Person) ois.readObject();//读取第一个对象 Person p2 = (Person) ois.readObject();//读取第二个对象 Person p3 = (Person) ois.readObject();//读取第三个对象 //关闭资源 ois.close(); System.out.println(p1); System.out.println(p2); System.out.println(p3); 结果: Person{name='张三', id=1} Person{name='李四', id=2} Person{name='王五', id=3}

大家看这个应该能看懂了吧,下面我顺便复习下前面的集合在演示个集合存取。


/** * 在程序目录下创建一个temp.properties文件 */ File dirPath = new File("."); //创建一个储存文件temp.properties文件的绝对路径 String filePath = dirPath.getCanonicalPath() + "\\src\\temp.properties"; //要存储的数据集合 List<Person> writeList = new ArrayList<>(); writeList.add(new Person("张三",1)); writeList.add(new Person("李四",2)); writeList.add(new Person("王五",3)); //创建一个序列化对象 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath)); //这里需要序列化对象,所以使用writeObject方法 oos.writeObject(writeList); //关闭资源 oos.close(); //创建一个反序列化对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath)); List<Person> readList = (List<Person>) ois.readObject(); //关闭资源 ois.close(); //遍历集合 Iterator<Person> iterator = readList.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } //结果: Person{name='张三', id=1} Person{name='李四', id=2} Person{name='王五', id=3}

写完了如果写得有什么问题,希望读者能够给小编留言,也可以点击[此处扫下面二维码关注微信公众号](https://www.ycbbs.vip/?p=28 "此处扫下面二维码关注微信公众号")

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:056-五十六、Java之Properties及对象序列化

    链接:https://www.javajike.com/article/1363.html

« 057-五十七、Java之Collections工具类
055-五十五、Java之手写HashMap(下)»

相关推荐

QR code