对象操作流(ObjectInputStream,ObjectOutputStream )
2017-07-04 20:52
369 查看
第1章 对象操作流
1.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) {
}
}
1.2 利用序列化流读写对象
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 +"]"; } }
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) { 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(); } }
1.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); //向下转型,获取具体的子类对象 ArrayList<Student> list = (ArrayList<Student>) obj; for (Student student : list) { System.out.println(student); } //释放资源 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(); } }
1.4解决读写对象版本不一致问题
import java.io.Serializable; public class Student implements Serializable { /** * */ 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 + "]"; } }
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.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();
}
}
相关文章推荐
- Socket同时使用ObjectInputStream和ObjectOutputStream传输序列化对象时的顺序
- ObjectInputStream与ObjectOutputStream类实现对象的存取
- 关于如何将一个对象保存到本地文件之ObjectOutputStream、ObjectInputStream的使用小结。
- java对象流ObjectInputStream、ObjectOutputStream的使用
- Java对象序列化ObjectOutputStream和ObjectInputStream示例
- 【IO流】ObjectOutputStream,ObjectInputStream 对象的读写
- Socket同时使用ObjectInputStream和ObjectOutputStream传输序列化对象时的顺序
- 对象流(ObjectOutputStream 和 ObjectInputStream)
- 对象序列化ObjectOutputStream,ObjectInputStream
- IO流之对象流ObjectOutputStream和ObjectInputStream
- Java IO系列(五):读写对象ObjectOutputStream和ObjectInputStream
- Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法
- Java-IO之对象输入流输出流(ObjectInputStream和ObjectOutputStream)
- java将系列化后的对象保存在文件中,及反系列化 (ObjectInputStream,ObjectOutputStream)
- Java-IO之对象输入流输出流(ObjectInputStream和ObjectOutputStream)
- (JAVA)从零开始之--对象输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)
- Socket同时使用ObjectInputStream和ObjectOutputStream传输序列化对象时的顺序
- Java-IO之对象输入流输出流(ObjectInputStream和ObjectOutputStream)
- IO流反序列化(objectInputStream)和序列化(ObjectOutputStream)连续存储对象StreamCorruptedException
- 不常用的 IO 流对象:ObjectInputStream/ObjectOutputStream