Java IO 04 Properties、序列化流、打印流

1 Properties

1.1 介绍

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

特点:

  • Hashtable的子类,map集合中的方法都可以用。
  • 该集合没有泛型,键值都是字符串。
  • 是一个可持久化的属性集。键值可以存储到集合中,也可以存储到持久化设备上(硬盘、U盘等)。键值的来源也可以是持久化设备。
  • 有和流技术相结合的方法。

示例:

// 1 创建集合对象
Properties prop=new Properties();
// 2 添加元素到集合
prop.setProperty("lisi", "98");
prop.setProperty("zhangsan", "90");
prop.setProperty("wanger", "93");
// 3 遍历集合
Set<String> keys=prop.stringPropertyNames();
for (String key : keys) {
    String value=prop.getProperty(key);
    System.out.println(key+"="+value);
}
1.2 将集合中内容存储到文件
// 1 创建集合对象
Properties prop=new Properties();
// 2 添加元素到集合
prop.setProperty("lisi", "98");
prop.setProperty("zhangsan", "90");
prop.setProperty("wanger", "93");
// 3 创建流
FileWriter fw=new FileWriter("prop.properties");
// 4 把集合中的数据存储到流所对应的文件中 store(Writer,comments)
prop.store(fw, "save data");
// 5 关闭流
fw.close();
1.3 读取文件中的数据,并保存到集合
// 1 创建集合
Properties properties=new Properties();
// 2 创建流对象
FileInputStream fi=new FileInputStream("prop.properties");
// FileReader fr=new FileReader("prop.properties"); // 如果有中文字符,使用FileReader
// 3 把流所对应的文件中的数据读取到集合中
properties.load(fi);
// 4 关闭流
fi.close();
// 5 显示集合中的数据
System.out.println(properties);

2 序列化流和反序列化流

2.1 介绍

ObjectInputStream:用于从流中读取对象的操作流,反序列化流
ObjectOutputStream:用于向流中写入对象的操作流,序列化流

特点:用于操作对象,可以将对象写入到文件中,也可以从文件中读取对象。

2.2 ObjectOutputStream

示例:

// 1 明确存储对象的文件
FileOutputStream fos = new FileOutputStream("myobj.object");
// 2 创建序列化流对象
ObjectOutputStream oos = new ObjectOutputStream(fos);
// 3 向流中写入内容 MyOb类要使用Serializable接口
oos.writeObject(new MyOb("zhangsan", 78));
// 4 关闭资源
oos.close();
2.3 ObjectInputStream
// 1 创建流对象
FileInputStream fis = new FileInputStream("myobj.object");
// 2 读取内容
ObjectInputStream ois = new ObjectInputStream(fis);

System.out.println(ois.readObject().toString());

// 3 关闭资源
ois.close();
2.4 序列化接口

当一个对象要能被序列化,这个对象所属的类必须实现Serializable接口。否则会发生异常NotSerializableException异常。

当反序列化对象时,如果对象所属的class文件在序列化之后进行了修改,那么进行反序列化也会发生异常InvalidClassException。发生这个异常的原因如下:

  • 该类的序列版本号与从流中读取的类描述符的版本号不匹配 。
  • 该类包含未知数据类型。
  • 该类没有可访问的无参数构造方法 。

Serializable标记接口,该接口给需要序列化的类提供了一个序列版本号,serialVersionUID。该版本号的目的在于验证序列化的对象和对应类是否版本匹配。

2.5 瞬态关键字 transient

当一个类的对象需要被序列化时,某些属性不需要被序列化,这时不需要序列化的属性可以使用关键字transient修饰。只要被transient修饰了,序列化时这个属性就不会被序列化了。

同时静态修饰的变量也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化。

3 打印流

3.1 介绍

打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式。

分类:

  • 字节打印流:PrintStream
  • 字符打印流:PrintWriter

示例:

// 1 创建流
PrintWriter pw = new PrintWriter("/Users/Mac/mydata/ioouttest.txt");
// 2 写数据
for (int i = 0; i < 5; i++) {
    pw.println("hello world");
}
// 3 关闭流
pw.close();

// 打印流数据自动刷新
PrintWriter pw = new PrintWriter(new FileWriter(""), true);

猜你喜欢

转载自blog.csdn.net/lihaogn/article/details/81155709