`

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是两个非常重要的类,分别用于序列化和反序列化。ObjectOutputStream将Java对象转换为字节流,而ObjectInputStream则将字节流恢复为Java对象。 下面是一个简单的...

    ObjectInputStream

    通过学习和实践`ObjectInputStream`,开发者可以有效地在内存、磁盘或网络之间传递Java对象,增强了程序的灵活性和可移植性。不过,同时也需要注意安全性和版本兼容性问题。在实际开发中,理解并掌握这些知识点是至...

    java.io常用方法(基本)

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

    socket objectoutputstream 传对象 例子

    在Java编程中,Socket和ObjectOutputStream是两个非常重要的概念,它们是进行网络通信的基础。Socket是TCP/IP协议的实现,提供了两台计算机之间双向、独立的数据传输通道。而ObjectOutputStream则是一个序列化流,...

    实验一java对象串行化编程.doc

    我们使用 FileOutputStream 和 FileInputStream 来读写文件,然后使用 ObjectOutputStream 和 ObjectInputStream 来将对象写入到文件中或从文件中读取对象。 实验目的: 1. 掌握对象串行化的概念和作用 2. 掌握...

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

    在 Java 中,`ObjectInputStream` 和 `ObjectOutputStream` 是两个非常重要的类,它们分别用于实现对象的反序列化和序列化。序列化是将对象的状态转换为字节流的过程,以便可以存储在磁盘上或通过网络传输。反序列化...

    JavaIOObjectStreams:FileInputStream 与 ObjectInputStream 和 ObjectOutputStream 的组合

    在Java I/O体系中,ObjectInputStream和ObjectOutputStream是两个关键类,它们提供了序列化和反序列化的功能,使得Java对象可以被写入到流中(例如磁盘或网络)并在之后重新读取。而FileInputStream则用于处理二进制...

    简易的 java 学生信息管理系统

    3. Java 对象序列化的使用,包括实现 Serializable 接口和使用 ObjectOutputStream 和 ObjectInputStream 类。 4. 文件输入/输出操作,包括使用 File、FileInputStream 和 FileOutputStream 类。 5.Hashtable 的使用...

    使用流套接字建立客户机

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

    Java对象流实例代码

    该机制通过使用ObjectOutputStream和ObjectInputStream两个类来实现对象的序列化和反序列化。 在Java对象流实例代码中,主要使用了ObjectOutputStream和ObjectInputStream两个类。ObjectOutputStream用于将对象写入...

    对象的写入与读取。将一个类的对象(例如:Calendar)写入到文件,然后顺序读出该对象,并验证读出的对象是否原始对象的克隆。

    4. **数据流和对象流**:数据流(如`DataOutputStream`和`DataInputStream`)通常用于处理基本数据类型,而对象流(`ObjectOutputStream`和`ObjectInputStream`)则专门处理Java对象。 5. **缓冲流...

    java基于命令行的学生成绩管理系统.pdf

    Java提供了ObjectOutputStream和ObjectInputStream类来进行对象的序列化和反序列化操作。 **实验过程及算法** 1. **设计学生类接口**:定义接口,包含添加成绩、查询成绩、显示排名等方法。 2. **实现集合操作**:...

    java多线程结合界面开发实例(原创)财务管理系统源代码和效果图[参考].pdf

    我们使用了ObjectOutputStream和ObjectInputStream类来实现对象的序列化和反序列化。 知识点10:Java开发实践 在这个实例中,我们使用了Java开发实践来实现财务管理系统。我们遵循了Java开发的最佳实践,使用了...

    Java输入输出练习

    通过这个实验,学生将学习如何使用 Java 语言进行文件输入输出操作,掌握 ObjectInputStream 和 ObjectOutputStream 两个类的使用方法,并了解如何将数据写入磁盘文件中。 一、实验目的 本次实验的目的是通过对 ...

    JAVA网络通信系统的研究与开发(论文+源代码+开题报告).rar

    ObjectOutputStream和ObjectInputStream类允许我们将Java对象转换为字节流,通过网络传输,然后在另一端恢复为原来的对象。这对于传递复杂的数据结构,如用户信息、订单等,非常实用。 论文中可能还涉及了异常处理...

    序列化Demo

    “序列化Demo”的内容可能包括了如何创建可序列化的Java类,如何使用ObjectOutputStream和ObjectInputStream进行序列化和反序列化操作,以及如何处理序列化过程中可能出现的问题,如版本控制和安全性。同时,IPCDemo...

    用java做的简易版QQ,只适用于学习

    ObjectOutputStream和ObjectInputStream类分别用于对象的序列化和反序列化。 5. **用户界面设计**:尽管这是一个简化版的QQ,但仍需有基本的用户交互界面。这可能涉及到Java Swing或JavaFX库,用于创建窗口、按钮、...

    java-chat-tool.zip_tool

    Java提供了ObjectOutputStream和ObjectInputStream类用于对象的序列化和反序列化,这样可以将聊天消息转化为字节流在网络上传输,到达目的地后再还原为原始对象。 代码的可维护性和优化也是重要的一环。如果部分...

    Java学习资料&项目源码&教程,基于java的聊天系统的设计于实现(系统35).zip

    3. **数据序列化**:Java的ObjectOutputStream和ObjectInputStream类用于序列化和反序列化对象,使得可以将聊天消息(可能是自定义的对象)通过网络传输。 4. **图形用户界面(GUI)**:Java提供了Swing和JavaFX等...

    北京动力节点Java零基础教程006 IO流作业答案,自己写的

    Java提供标准的序列化API,主要包括java.io.Serializable接口和ObjectOutputStream及ObjectInputStream类。 使用序列化,我们可以持久化对象的状态,即使程序关闭后,再次运行时也能恢复之前的对象状态。例如,在...

Global site tag (gtag.js) - Google Analytics