zoukankan      html  css  js  c++  java
  • 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:网络

  • 相关阅读:
    Ubuntu(Linux) + mono + jexus +asp.net MVC3 部署
    爬虫代理
    爬取文件时,对已经操作过的URL进行过滤
    Scrapy项目创建以及目录详情
    Scrapy 框架 安装
    爬虫案例
    爬虫基础以及 re,BeatifulSoup,requests模块使用
    Django_Admin操作
    django 权限管理permission
    Node--01
  • 原文地址:https://www.cnblogs.com/sdksdk0/p/5585060.html
Copyright © 2011-2022 走看看