javaSE基础之对象操作流

课程笔记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; //这
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值