Java_22 字符流与字节流(IO流)②对象操作流

1、概述

用于从流中读取对象的

ObjectInputStream 称为 反序列化流,利用输入流从文件中读取对象
ObjectOutputStream 称为 序列化流,利用输出流向文件中写入对象
特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。

/*	
 * 对象操作流:可以用于读写任意类型的对象
 * 		ObjectOutputStream
 * 				writeObject 
 * 				ObjectOutputStream(OutputStream out) 
 * 		ObjectInputStream
 * 				readObject
 * 				ObjectInputStream(InputStream in)
 * 
 * 注意:
 * 		使用对象输出流写出对象,只能使用对象输入流来读取对象
 * 		只能将支持 java.io.Serializable 接口的对象写入流中
 * 
 */
public class ObjectOutputStreamDemo2 {
	public static void main(String[] args)  {
		
	}

}

2、利用序列化流读写对象

Student.java

import java.io.Serializable;

public class Student implements Serializable {
	

	/**
	 * 
	 */
	String name;
	int age;

	
	public Student(String name,int age) {
		this.name = name;
		this.age = age;
	}


	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age +"]";
	}
}

ObjectOutputStreamDemo.java

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/*	
 * 使用对象输出流和读对象输入流写对象
 * Exception in thread "main" java.io.NotSerializableException: com.itheima_07.Student
 * Serializable:序列号,是一个标识接口,只起标识作用,没有方法
 * 				当一个类的对象需要IO流进行读写的时候,这个类必须实现该接口
 * 
 * Exception in thread "main" java.io.EOFException:当输入过程中意外到达文件或流的末尾时,抛出此异常。
 * 
 */
public class ObjectOutputStreamDemo {
	public static void main(String[] args) throws IOException, ClassNotFoundException  {
		//method();
		//创建对象输入流的对象
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
		//读取对象
		/*Object obj = ois.readObject();
		System.out.println(obj);
		
		Object obj2 = ois.readObject();
		System.out.println(obj2);
		
		Object obj3 = ois.readObject();
		System.out.println(obj3);*/
		
		try {
			while(true) {//死循环,当出现EOFException异常时结束循环
				Object obj = ois.readObject();
				System.out.println(obj);
			}
		} catch(EOFException e) {
			System.out.println("读到了文件的末尾");
		}
		
		//释放资源
		ois.close();
	}

	private static void method() throws IOException, FileNotFoundException {
		//创建对象输出流的对象
		//FileOutputStream fos = new FileOutputStream("a.txt");
		//ObjectOutputStream oos = new ObjectOutputStream(fos);
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
		
		//创建学生对象
		Student s = new Student("zhangsan",18);
		Student s2 = new Student("lisi",19);
		//写出学生对象
		oos.writeObject(s);
		oos.writeObject(s2);
		
		//释放资源
		oos.close();
	}

}
/*
	此时进入a.txt文件中查看时,发现a.txt中的内容类似于乱码
*/

3、解决对象输入流读取对象出现异常的问题

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

/*
 * 解决对象输入流读取对象出现异常的问题
 * 
 */
public class ObjectOutputStreamDemo3 {
	public static void main(String[] args) throws IOException, ClassNotFoundException   {
		//method();
		
		//创建对象输入流的对象
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("b.txt"));
		//读取数据
		Object obj = ois.readObject(); 
		//System.out.println(obj);
		/*
			输出结果为对象:
				[Student[name=wangwu,age=30],Student[name=zhaoliu,age=28]]
		*/
		
		//向下转型,获取具体的子类对象
		ArrayList<Student> list = (ArrayList<Student>) obj;
		for (Student student : list) {
			System.out.println(student);
		}
		/*
			输出结果为具体的对象:
				Student[name=wangwu,age=30]
				Student[name=zhaoliu,age=28]
		*/
		//释放资源
		ois.close();
	}

	private static void method() throws IOException, FileNotFoundException {
		//创建对象输出流的对象
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("b.txt"));
		//创建集合对象
		ArrayList<Student> list = new ArrayList<Student>();
		//添加学生对象
		list.add(new Student("wangwu",30));
		list.add(new Student("zhaoliu",28));
		//写出集合对象
		oos.writeObject(list);
		
		//释放资源
		oos.close();
	}
}

4、解决读写对象版本不一致问题

Student.java

import java.io.Serializable;

public class Student implements Serializable {
	/**
	 * serialVersionUID :序列号,当一个类中成员变量发生变化时,该类的序列号也会改变,给一个类赋上一个序列号,则,当他的成员变量发生变化时,该类的序列号并不会随之改变
	 */
	private static final long serialVersionUID = 6361890890437825953L;
	String name;
	int age;
	String gender;

	
	public Student(String name,int age) {
		this.name = name;
		this.age = age;
	}


	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";
	}
 
}

ObjectOutputStreamDemo4 .java

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/*
 * 解决对实现序列化接口出现的黄色警告问题:
 * 		出现警告的原因:这是因为当你改变Student类的成员变量时,学生类的序列号会随之改变,而此时读取对象的学生序列号并不会改变,因此会导致对象的读取异常报错
 * 		解决:给Student类赋值一个序列号
 * Exception in thread "main" java.io.InvalidClassException
 * 当 Serialization 运行时检测到某个类具有以下问题之一时,抛出此异常。 
		该类的序列版本号与从流中读取的类描述符的版本号不匹配 
		该类包含未知数据类型 
		该类没有可访问的无参数构造方法 
 * 
 */
public class ObjectOutputStreamDemo4 {
	public static void main(String[] args) throws IOException, ClassNotFoundException  {
		//method();
		
		method2();
	}
	
	//读取学生对象
	private static void method2() throws IOException, FileNotFoundException, ClassNotFoundException {
		//创建对象输入流的对象
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c.txt"));
		//读取对象
		Object obj = ois.readObject();
		System.out.println(obj);
		//释放资源
		ois.close();
	}
	
	//写出学生对象
	private static void method() throws IOException, FileNotFoundException {
		//创建对象输出流的对象
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c.txt"));
		//创建的学生对象
		Student s = new Student("qianqi",28);
		//写出学生对象
		oos.writeObject(s);
		//释放资源
		oos.close();
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值