对象流
对象流的好处:
1、增强了缓冲区功能 2、增强了读写8种基本数据类型和字符串功能:readByte()、writeByte()、readChar()、writeChar()等。 3、增强了读写对象的功能:readObject()、writeObject(Object obj)。
序列化和反序列化:
使用流传输对象的过程就叫做序列化、反序列化。 序列化指的是将java对象转换为字节的过程。 反序列化指的是将字节恢复成对象的过程。
首先创建一个对象类
package com.exam.domain;
import java.io.Serializable;
/**
* @Author: wangwang
* @Date: 2022-12-13-3:47
* @Description:
*/
//需要实现Serializable接口,来标识当前类可以用做序列化操作
public class User implements Serializable {
/**
* 版本号
* 为了兼容不容版本的差异,如果版本号发生改变,在反序列化过程中就会因为版本号差异无法正常反序列化
*/
private static final long serialVersionUID = 1L;
public User() {
}
//使用有参构造函数完成对象初始化操作
public User(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
private String name;
private int age;
//可以使用transient注解,来标识该属性不需要序列化操作
private transient String sex;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
1、ObjectInputStream(对象输入流)
/**
* 序列化
*
* @Author: wangwang
* @Date: 2022-12-13-0:50
* @Description:
*/
public class InputStreamDemo {
public static void main(String[] args) throws Exception {
//创建文件输出流对象,指定输出文件地址
FileOutputStream fileOutputStream = new FileOutputStream("D:\\stu\\eee.txt");
//创建对象输出流,传入文件输出流对象
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
//创建对象
User user = new User("小明", 19, "男");
//输出对象信息到文件中
objectOutputStream.writeObject(user);
//关闭对象输出流
objectOutputStream.close();
}
}
2、ObjectOutputStream(对象输出流)
/**
* 反序列化
*
* @Author: wangwang
* @Date: 2022-12-13-0:50
* @Description:
*/
public class InputStreamDemo {
public static void main(String[] args) throws Exception {
//创建文件输入字节流对象,定义输入文件地址
FileInputStream fileInputStream = new FileInputStream("D:\\stu\\eee.txt");
//定义对象输入数据流,指定文件输出流对象
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
//读取文件数据
User user = (User) objectInputStream.readObject();
//这里如果数据读取完毕后再次读取,会发生EOFException异常,表示数据已经读取完毕了,没有数据可以继续读取了。
// User user1 = (User) objectInputStream.readObject();
//操作对象数据
System.out.println(user.toString());
//关闭对象输入流
objectInputStream.close();
}
}
序列化、反序列化注意事项:
1、需要序列化的类必须实现Serializable接口,否则会报NotSerializableException:不可序列化异常。 2、如果类中存在对象属性,则该对象属性也要实现Serializable接口。 3、尽量自定义序列化版本号,保证序列化和反序列化的是同一个类。 4、可以使用transient关键字修饰列表的成员属性。表明该属性不参与序列化操作。 5、静态属性不参与初始化。 6、序列化多个对象,可以使用集合实现。
使用集合反序列化多个对象
/**
* 使用集合反序列化多个对象
*
* @Author: wangwang
* @Date: 2022-12-13-0:50
* @Description:
*/
public class InputStreamDemo {
public static void main(String[] args) throws Exception {
//创建文件输出流对象,指定输出文件地址
FileOutputStream fileOutputStream = new FileOutputStream("D:\\stu\\eee.txt");
//创建对象输出流,传入文件输出流对象
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
List<User> list = new ArrayList<>();
//创建对象
User user = new User("小明", 19, "男");
User user1 = new User("小红", 20, "女");
list.add(user);
list.add(user1);
//输出对象信息到文件中 这里输出一个集合信息
objectOutputStream.writeObject(list);
//关闭对象输出流
objectOutputStream.close();
}
}
使用集合序列化多个对象
/**
* 使用集合序列化多个对象
*
* @Author: wangwang
* @Date: 2022-12-13-0:50
* @Description:
*/
public class InputStreamDemo {
public static void main(String[] args) throws Exception {
//创建文件输入字节流对象,定义输入文件地址
FileInputStream fileInputStream = new FileInputStream("D:\\stu\\eee.txt");
//定义对象输入数据流,指定文件输出流对象
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
//读取文件数据
List<User> list = (List<User>) objectInputStream.readObject();
//操作对象数据
System.out.println(list.toString());
//关闭对象输入流
objectInputStream.close();
}
}

浙公网安备 33010602011771号