`

ObjectOutputStream和ObjectInputStream类的学习

阅读更多
ObjectOutputStream和ObjectInputStream类所读写的对象必须实现了Serializable的接口,对象中的transient和static类型的成员变量不会被读取和写入.
下面是UML图





下面是代码例子1
import java.io.File;
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.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ObjectputStreamTest {

	private static File getFile()
	{
		return new File(System.getProperty("user.dir")+"/student.txt");
	}
	/**
	 * 读取文档数据
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private static List<Student> getStudents()
	{
		File file = getFile();
		List<Student> list = null;
		FileInputStream fis = null;
		ObjectInputStream ois = null;

		try {
			fis = new FileInputStream(file);
			if(fis.available()!=-1)
			{
				ois = new ObjectInputStream(fis);
				Object obj = ois.readObject();
				list = (ArrayList<Student>)obj;
			}else
			{
				list = new ArrayList<Student>();
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}catch (ClassNotFoundException e) {
			e.printStackTrace();
		}finally
		{
			try {
				fis.close();
				ois.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			fis = null;
			ois=null;
		}
		return list;
	}
	/**
	 * 更改数据
	 * @param list
	 */
	private static void setStudents(List<Student> list)
	{
		File file = getFile();
		FileOutputStream fos =null;
		ObjectOutputStream oos=null;
		
		try {
			fos = new FileOutputStream(file);
			oos = new ObjectOutputStream(fos);
			oos.writeObject(list);
			oos.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally
		{
			try {
				fos.close();
				oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			fos=null;
			oos=null;
			
		}
		
	}
	/**
	 * 插入数据
	 * @param stu
	 */
	public static void insert(Student stu)
	{
		List<Student> list = getStudents();
		list.add(stu);
		setStudents(list);
	}
	/**
	 * 更新数据
	 * @param i
	 * @param stu
	 */
	public static void update(int i,Student stu)
	{
		List<Student> list = getStudents();
		list.remove(i);
		list.add(i,stu);
		setStudents(list);
	}
	/**
	 * 删除数据
	 * @param i
	 */
	public static void delete(int i)
	{
		List<Student> list = getStudents();
		list.remove(i);
		setStudents(list);
	}
	
	@SuppressWarnings("static-access")
	public static void print(List<Student> list)
	{
		for (Iterator<Student> iterator = list.iterator(); iterator.hasNext();) {
			Student student = (Student) iterator.next();
			System.out.print("id="+student.getId()+",name="+student.getName()+",count="+student.getCount()+",sex="+student.getSex()+",serialVersionUID="+student.getSerialVersionUID());
			System.out.println();
		}
	}
	public static void main(String[] args) {
		List<Student> list = new ArrayList<Student>();
		Student stu = new Student();
		stu.setName("chendingqiang");
		stu.setSex("男");
		list.add(stu);
		
		stu = new Student();
		stu.setName("limoumou");
		list.add(stu);
		
		ObjectputStreamTest.setStudents(list);
		list = ObjectputStreamTest.getStudents();
		print(list);
		System.out.println("==================================");
		//修改
		
		stu = new Student();
		stu.setName("陈顶强");
		ObjectputStreamTest.update(0, stu);
		list = ObjectputStreamTest.getStudents();
		print(list);
		
		//删除
		System.out.println("==================================");
		ObjectputStreamTest.delete(0);
		list = ObjectputStreamTest.getStudents();
		print(list);
		
		//插入
		System.out.println("==================================");
		stu = new Student();
		stu.setName("zhumoumou");
		ObjectputStreamTest.insert(stu);
		list = ObjectputStreamTest.getStudents();
		print(list);
	}
	
	
	

}
class Student implements Serializable
{
	private static final long serialVersionUID = 1L;

	private transient String sex;//瞬态不能序列化
	private int id;
	private String name;
	private static int count=1;

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Student() {
		id=count;
		count++;
	}
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Student)
		{
			Student stu = (Student)obj;
			if(this.id == stu.id)
			{
				return true;
			}
		}
		return false;
	}
	public static int getCount() {
		return count;
	}
	public static void setCount(int count) {
		Student.count = count;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public static long getSerialVersionUID() {
		return serialVersionUID;
	}
	

}

当在继承的时候,超类如果不是可序列化,那么超类一定要有一个无参数的构造函数,以便允许初始化其字段。在此情况下,子类负责保存和恢复不可序列化的类的状态。不然会抛出这个异常java.io.InvalidClassException
下面会出现异常的版本
public class Shape {
	private int diameter;

	public int getDiameter() {
		return diameter;
	}

	public void setDiameter(int diameter) {
		this.diameter = diameter;
	}

	/**
	 * 不提供无参数构造函数
	 * @param diameter
	 */
	public Shape(int diameter) {
		this.diameter = diameter;
	}
	
}
import java.io.Serializable;

@SuppressWarnings("serial")
public class Circle extends Shape implements Serializable {

	private int r;
	public Circle(int diameter,int r) {
		super(diameter);
		this.r = r;
		
	}
	public int getR() {
		return r;
	}
	public void setR(int r) {
		this.r = r;
	}

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

public class ExtendObjecTest {
	public static void main(String[] args) {
		File file = new File(System.getProperty("user.dir")+"/student.txt");
		Circle c  = new Circle(12,32);
		FileOutputStream fos =null;
		ObjectOutputStream oos=null;
		try {
			fos = new FileOutputStream(file);
			oos = new ObjectOutputStream(fos);
			oos.writeObject(c);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally
		{
			try {
				fos.close();
				oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			fos=null;
			oos=null;
		}
		
		FileInputStream fis = null;
		ObjectInputStream ois = null;
		
		try {
			fis = new FileInputStream(file);
			ois = new ObjectInputStream(fis);
			Circle result = (Circle)ois.readObject();
			System.out.println("diameter:"+result.getDiameter()+",r:"+result.getR());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

提供无参数构造函数的版本
public class Shape {
	private int diameter;

	public int getDiameter() {
		return diameter;
	}

	public void setDiameter(int diameter) {
		this.diameter = diameter;
	}

	/**
	 * 提供无参数构造函数
	 * @param diameter
	 */
	public Shape() {
		
	}
	
}
@SuppressWarnings("serial")
public class Circle extends Shape implements Serializable {

	private int r;
	public Circle(int r) {
		this.r = r;
		
	}
	public int getR() {
		return r;
	}
	public void setR(int r) {
		this.r = r;
	}

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

public class ExtendObjecTest {
	public static void main(String[] args) {
		File file = new File(System.getProperty("user.dir")+"/student.txt");
		Circle c  = new Circle(32);
		c.setDiameter(23);
		FileOutputStream fos =null;
		ObjectOutputStream oos=null;
		try {
			fos = new FileOutputStream(file);
			oos = new ObjectOutputStream(fos);
			oos.writeObject(c);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally
		{
			try {
				fos.close();
				oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			fos=null;
			oos=null;
		}
		
		FileInputStream fis = null;
		ObjectInputStream ois = null;
		
		try {
			fis = new FileInputStream(file);
			ois = new ObjectInputStream(fis);
			Circle result = (Circle)ois.readObject();
			System.out.println("diameter:"+result.getDiameter()+",r:"+result.getR());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}
  • 大小: 14.3 KB
  • 大小: 16.6 KB
分享到:
评论

相关推荐

    java序列化与ObjectOutputStream和ObjectInputStream的实例详解

    主要介绍了java序列化与ObjectOutputStream和ObjectInputStream的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下

    java.io常用方法(基本)

    我自己写的一些关于IO中的见解,可以用来参考。 File的增、删、改、查,FileReader和FileWriter类,BufferedReader和BufferedWriter类,ObjectOutputStream和ObjectInputStream类

    ObjectInputStream 和 ObjectOutputStream 介绍_动力节点Java学院整理

    ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持。本文给大家详细介绍了ObjectInputStream 和 ObjectOutputStream的相关知识,感兴趣的朋友一起学习吧

    实验一对象序列化1

    } 由于定义了二个接口方法,方法参数分别是ObjectOutputStream和ObjectInputStream类型对象,因此这二个接口方法必须通过实现该接口

    使用流套接字建立客户机

    使用流套接字建立客户机 运用ObjectOutputStream,ObjectInputStream,ServerSocket,Socket;

    JavaIOObjectStreams:FileInputStream 与 ObjectInputStream 和 ObjectOutputStream 的组合

    JavaIO对象流 FileInputStream 与 ObjectInputStream 和 ObjectOutputStream 的组合 奥利弗·缪尔

    java io 类 小结 代码

    简洁分类 代码直接使用 InputStream OutputStream Reader Writer FileInputStream FileOutputStream FileReader FileWriter InputStreamReader ...ObjectOutputStream ObjectInputStream Scanner

    SocketTutorial:JavaPython 套接字教程 (10152014)

    套接字教程Python 和 Java 中的套接字教程。 虽然我已经包含了用于在 Python 和 Java 中设置服务器的文件,...聊天服务更多与套接字线程:下周见贝克的演讲ObjectOutputStream 和 ObjectInputStream 例子GUI Chat(见

    使用Java序列化实现一个简单的文件备份工具.txt

    在该方法中,首先通过FileInputStream和ObjectInputStream读取源文件对象,然后通过ObjectOutputStream将读取的对象写入备份文件中。这个简单的示例代码展示了如何使用Java序列化来实现一个文件备份工具的简单功能,...

    通讯录JAVA程序设计实验报告

    程序使用了ObjectInPutStream和ObjectOutPutStream这两个文件输入输出流,利用这两个文件输入输出流,可以方便的直接将通讯记录对象直接写入文件中,另外为了方便添加和删除一条记录还使用了系统的对象数组类...

    JAVA笔记??序列化

    所谓的对象序列化(在很多地方也被成为串行化),是指将对象转换成二进制...ObjectInputStream类与ObjectOutputStream类,用于帮助开发者完成保存和读取对象成员变量取值的过程,但要求读写或存储的对象必须实现了Seria

    bytestreamdemo.zip

    java IO 字节流练习代码 FileInputStream和FileOutputStream BufferedInputStream 和 BufferedOutputStream DataInputStream 和 ...ObjectInputStream和ObjectOutputStream PrintStream PushbackInputStream

    java项目超市

    ObjectInputStream ois =new ObjectInputStream(is); // 2.获取输出流 OutputStream os = socket.getOutputStream(); ObjectOutputStream oos =new ObjectOutputStream(os); Choice c=new Choice(); c....

    使用Java的文件操作实现一个简单的通讯录管理系统.txt

    loadContactsFromFile()方法使用FileInputStream和ObjectInputStream对象来读取文件中保存的Contact对象列表。如果读取失败,会抛出IOException和ClassNotFoundException异常,此时会调用saveContactsToFile()方法将...

    人工智能-项目实践-搜索引擎-java实验1-实现搜索引擎的倒排索引数据结构

    java实验1-实现搜索引擎的倒排索引数据结构 实验1知识点: 集合类的使用如ArrayList,HashMap ◦对这些集合类的操作包括...具体使用方法,请见hust.cs.javacourse.search.util.FileUtils类的read方法和write方法 设计

    JDK_API_1_6

    ObjectInputStream ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。 ObjectInputStream.GetField 提供对从输入流读取的持久字段的访问权限。 ObjectOutputStream ...

    android 面试题

    4.java.io包中的objectinputstream和objectoutputstream类主要用于对对象(Object)的读写。 5.android 中service的实现方法是:startservice和bindservice。 6.activity一般会重载7个方法用来维护其生命周期,除了...

    Java之IO流学习总结

    ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。 2.输出字节流OutputStream IO 中输出字节流的继承图可见上图,可以看出: OutputStream 是所有的输出字节流的父类,它是一个...

    AIC的Java课程1-6章

     掌握串行化概念,学会使用FileInputStream,FileOutputStream,ObjectInputStream,ObjectOutputStream等类输入输出对象。  明白通过捕获异常判定输入文件流的结束。  [*]知道使用RandomAccessFile...

    JAVA基础课程讲义

    ObjectInputStream和ObjectOutputStream 158 PrintStream 158 Reader 158 Writer 159 FileReader和FileWriter 159 BufferReader和BufferWriter 159 InputStreamReader和OutputStreamWriter 161 JAVA对象的序列化和反...

Global site tag (gtag.js) - Google Analytics