课程笔记Day20
- 对象操作流
- 属性集Properties
第一章 对象操作流
第01节 ObjectOutputStream
快速入门
//目标:学习对象操作流的快速入门(对象序列化操作)
public class Test01 {
public static void main(String[] args) throws IOException {
String path = "JavaSEDay20\\dir\\文件01.txt";
//1.创建对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
//2.读写数据
oos.writeObject(1314);
//3.释放资源
oos.close();
}
}
//小结:将对象,保存到本地文件当中,序列化操作。 对象 --> 文件。
常见问题
1. 为什么序列化接口 Serializable 当中没有任何方法呢?
序列化接口 Serializable 称之为 "标记型接口" (标记型接口:没有任何方法的接口)
他只是给出一个标记,用于给 ObjectOuputStream 进行识别的。
2. 异常问题:
A. 未序列化的异常 NotSerializableException
原因: 我们的类,没有实现标识接口 Serializable
解决:类上限需要实现序列化接口 Serializable
第02节 ObjectInputStream
快速入门
//目标:学习ObjectInputStream 读取数据的操作
public class Test03 {
public static void main(String[] args) throws Exception {
String path = "JavaSEDay20\\dir\\文件01.txt";
//1.创建对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
//2.读写数据
Object o = ois.readObject();
//3.释放资源
ois.close();
System.out.println(o);
}
}
常见问题
1. 异常:InvalidClassException
A. 原因: 当我们先采用 writeObject 写对象,然修改了 类文件信息,再次 readObject 就会出现此异常。因为字节码变化了。
B. 解决: 需要告诉字节码无论怎么改变,我就是我。 需要添加序列化的 ID 证明我就是我
C. 例如: private static final long serialVersionUID = 1L;
2. 不想被序列化怎么办?
可以采用 瞬态关键字,给成员变量,添加瞬态。
例如: transient int age;
举例: java.util.Date 类底层有一个 fastTime
3. 出现异常 EOFException
原因: 写对象 writeObject() 的次数和读对象 readObject() 的次数不一致。
解决: 我们的对象只写一次,我们的对象只读一次即可。
第03节 标准写法
汽车类
import java.io.Serializable;
//汽车类
//1. 需要实现序列化的接口
//2. 需要添加序列化的ID
//3. 可以添加瞬态关键字
public class Car implements Serializable {
private String brand;
private transient int price;
private static final long serialVersionUID = 10L;
public Car(String brand, int price) {
this.brand = brand;
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
'}';
}
}
测试类
public class Test05 {
public static void main(String[] args) throws Exception{
//写数据
//writeData();
//读数据
readData();
}
//写数据的方法
public static void writeData() throws Exception{
ArrayList<Car> array = new ArrayList<>();
array.add(new Car("五菱宏光",3));
array.add(new Car("劳斯莱斯",3000));
//写数据的操作
String path = "JavaSEDay20\\dir\\文件03.txt";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
oos.writeObject(array);
oos.close();
}
//读数据的方法
public static void readData() throws Exception{
String path = "JavaSEDay20\\dir\\文件03.txt";
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
Object o = ois.readObject();
ois.close();
ArrayList<Car> array = (ArrayList<Car>) o;
array.forEach(System.out::println);
}
}
第04节 深浅克隆
基础理论
对象的拷贝复制是不可以使用 等号的。例如:
Student one = new Student("迪丽热巴",23);
Student two = one; //这