黑马程序员技术交流社区

标题: IO接口原理第六贴 [打印本页]

作者: 刘付力    时间: 2012-8-1 12:00
标题: IO接口原理第六贴
------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----
关于IO接口原理的第五贴                生命不息,折腾不止!向上吧,骚年!!! 
第一节、对象流
JDK提供的ObjectoutputStream和ObjectInputStream类是用于存储和读取基本类型数据或对象的过滤流。他的最强大之处就是可以把java中的对象写到数据源中
也能把对象从数据源中还原回来。用ObjectOutputStream类保存基本类型数据或对象的机制叫做序列化;用ObjectInputStream类读取基本数据类型或对象的机制叫做反序列化。ObjectOutputStream
和objectInputStream不能序列化static或transient修饰的成员变量。
定义一个序列化的student类。


public class Student implements java.io.Serializable {

        private static final long serialVersionUID = 6858255444765880074L;
        private int id ;
    private String name;
    private transient int age; //不需要序列化的属性
   
    public Student(){}
    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public int getId() {    return id;    }
    public String getName() {    return name;    }
    public int getAge() {    return age;    }
    public String toString() {
        return "id=" + id +", name=" + name + ", age=" + age;
    }
}
在student类的实例被序列化时,他的成员变量age不会被保存或读取,序列化的好处在于,他可以将任何实现了Serializable接口的对象转换为字节数据。
这些数据可以保存在数据源中,以后仍可以还原为原来的对象状态,及时这些数据通过网络传输到别处也能还原回来。
下面创建一个学生对象,并把它序列化到一个文件中。


import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/** 序列化示例 */
public class SerializationTest {
        public static void main(String[] args) {
                ObjectOutputStream oos = null;
                try {
                        //创建连接到指定文件的对象输出流实例
                        oos = new ObjectOutputStream(
                                                new FileOutputStream("D:\\IOTest\\objectSeri.dat"));
                        oos.writeObject(new Student(101, "张三", 22));  //把stu对象序列化到文件中
                        oos.flush();  //刷新输出流
                        System.out.println("序列化成功!!!");
                } catch (IOException e) {
                        e.printStackTrace();
                } finally {
                        try {
                                if (null != oos) {
                                        oos.close();  //关闭输出流实例
                                }
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                }
        }
}


下面再给出个反序列化的事例:


import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

/** 反序列化示例 */
public class DeserializationTest {
        public static void main(String[] args) {
                ObjectInputStream ois = null;
                try {
                        //创建连接到指定文件的对象输入流实例
                        ois = new ObjectInputStream(
                                        new FileInputStream("D:\\IOTest\\objectSeri.dat"));
                        Student stu = (Student) ois.readObject();  //读取对象
                        System.out.println(stu); //输出读到的对象信息
                } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                } finally {
                        try {
                                if (null != ois) {
                                        ois.close(); //关闭对象流实例
                                }
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                }
        }
}

程序运行的结果如下:id=101,name=张三,age=0

------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! --------





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2