ObjectOutputStream 和 ObjectInputStream的使用

一、看一下API文档

ObjectOutputStream :

ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。

writeObject 方法用于将对象写入流中。所有对象(包括 String 和数组)都可以通过 writeObject 写入。可将多个对象或基元写入流中。必须使用与写入对象时相同的类型和顺序从相应 ObjectInputstream 中读回对象。

还可以使用 DataOutput 中的适当方法将基本数据类型写入流中。还可以使用 writeUTF 方法写入字符串。

对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。其他对象的引用(瞬态和静态字段除外)也会导致写入那些对象。可使用引用共享机制对单个对象的多个引用进行编码,这样即可将对象的图形恢复为最初写入它们时的形状。

ObjectInputStream :

ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。

ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。

ObjectInputStream 确保从流创建的图形中所有对象的类型与 Java 虚拟机中显示的类相匹配。使用标准机制按需加载类。

只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。 

二、案例说明

下面以一个例子来说明:

首先定义一个学生类,主要用于后面的封装。

//ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入

public class Student implements Serializable {
	private static final long serialVersionUID = -187877186941003078L;
	String name;
	int id;
	transient int age;   // transient   瞬时的,不持久化. 此处若把transient加上,就可以单独不对age进行持久化操作transient int age

	String department;

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

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

}


然后把serializtion写上就可以了。

//对象输入输出流,对象持久化操作,字节流的子类
public class Serializtion {
	public static void main(String[] args) throws IOException {
		Student s1 = new Student("张三", 1, 20, "数据结构");
		Student s2 = new Student("李四", 2, 19, "网络");

		List<Student> list=new ArrayList<Student>();
		list.add( s1);
		list.add(s2);

		/*ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和
		FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。*/

		// 将学生信息封装到student.txt中
		// 创建一个向 student.txt 的文件中写入数据的文件输出流。
		FileOutputStream fout = new FileOutputStream("student2.txt");

		//ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。
		ObjectOutputStream out = new ObjectOutputStream(fout);

		//writeObject 方法负责写入特定类的对象状态,以便相应的 readObject 方法可以恢复它。
		out.writeObject(list);

		//FileInputStream 类从文件系统中的一个文件中获取输入字节。
		FileInputStream fin = new FileInputStream("student2.txt");
		//创建从指定 InputStream 读取的 ObjectInputStream。从流读取序列化头部并予以验证。
		ObjectInputStream in = new ObjectInputStream(fin);   

		// 捕获异常
		try {
			/* readObject 方法为类重写默认的反序列化
			readObject 方法用于从流读取对象。应该使用 Java 的安全强制转换来获取所需的类型。
			在 Java 中,字符串和数组都是对象,所以在序列化期间将其视为对象。读取时,需要将其强制转换为期望的类型。*/
			List<Student> l= (List<Student>) in.readObject();
			for(  Student s: l){
				System.out.println(   s );
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

		// 关闭流
		out.close();
		in.close();

	}
}

最后会输出:
name:张三 id:1
age:20 department:数据结构
name:李四 id:2
age:19 department:网络

时间: 2024-12-30 16:05:25

ObjectOutputStream 和 ObjectInputStream的使用的相关文章

android-安卓的ObjectOutputStream和ObjectInputStream问题。。。。

问题描述 安卓的ObjectOutputStream和ObjectInputStream问题.... private void savalist(){ try { FileOutputStream fos = this.openFileOutput(""oauth_1.out""Context.MODE_WORLD_READABLE); ObjectOutputStream oos = new ObjectOutputStream(fos); for (int i

我的Java开发学习之旅------&amp;gt;Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法

今天用ObjectOutputStream和ObjectInputStream进行对象序列化话操作的时候,报了java.io.EOFException异常. 异常代码如下: java.io.EOFException at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2554) at java.io.ObjectInputStream.readObject0(ObjectInputSt

Java IO--对象序列化Serializable、ObjectOutputStream、ObjectInputStream、transient

1.对象序列化是什么? 一个对象产生之后实际上是在内存中为其开辟了一个存储空间,方便存储信息. 定义可序列化的类: import java.io.Serializable ; public class Person implements Serializable{ private String name ; // 声明name属性,但是此属性不被序列化 private int age ; // 声明age属性 public Person(String name,int age){ // 通过构造

ObjectInputStream ObjectOutputStream

object|stream ObjectOutputStream和ObjectInputStream --ObjectOutputStream ObjectInputStream 类恢复以前使用 ObjectOutputStream 类序列化后的基本类型数据和对象. ObjectOutputStream 和 ObjectInputStream 分别利用 FileOutputStream 和 FileInputStream 能支持应用程序实现对象图象的稳定存储. ObjectInputStream

java io学习(四) ObjectInputStream 和 ObjectOutputStream

本章,我们学习ObjectInputStream 和 ObjectOutputStream ObjectInputStream 和 ObjectOutputStream 介绍 ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持. 创建"文件输出流"对应的ObjectOutputStream对象,该ObjectOutputStream对象能提供对"基本数据或对象"的持久存储:当我们需要读取这些存储

java io系列05之 ObjectInputStream 和 ObjectOutputStream

本章,我们学习ObjectInputStream 和 ObjectOutputStream ObjectInputStream 和 ObjectOutputStream 介绍 ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持.创 建"文件输出流"对应的ObjectOutputStream对象,该ObjectOutputStream对象能提供对"基本数据或对象"的持久存储: 当我们需要读取这些存

Java objectOutputStream的用法

ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInputStream 读取(重构)对象.通过在流中使用文件可以实现对象的持久存储.如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象. 只能将支持 java.io.Serializable 接口的对象写入流中.每个 serializable 对象的类都被编码,编码内容包括类名和类签名.对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包. w

java序列化的控制

正如大家看到的那样,默认的序列化机制并不难操纵.然而,假若有特殊要求又该怎么办呢?我们可能有特殊的安全问题,不希望对象的某一部分序列化:或者某一个子对象完全不必序列化,因为对象恢复以后,那一部分需要重新创建. 此时,通过实现Externalizable接口,用它代替Serializable接口,便可控制序列化的具体过程.这个Externalizable接口扩展了Serializable,并增添了两个方法:writeExternal()和readExternal().在序列化和重新装配的过程中,会

Java对象序列化使用基础

所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象.这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新"装配".像RMI.Socket.JMS.EJB它们中的一种,彼此为什么能够传递Java对象,当然都是对象序列化机制的功劳. Java对象序列化机制一般来讲有两种用途: Java的JavaBeans: Bean的状态信息通常是在设计时配置的,Bean的状态信息必须被