zoukankan      html  css  js  c++  java
  • IO-对象流


    对象的序列化:将对象转换为字节序列
    对象的反序列化:将字节序列还原(恢复)成对象
      序列化的优点:
        1.可以将对象通过序列化保存到本地磁盘,起到方便存储的作用
        2.可以通过对象序列化在网络之间进行传输,起到数据共享的作用
      实现步骤:
        前提:如果一个类要完成对象的序列化,该类必须实现Serializable接口(标示性接口)
        1.将要实现对象序列化的类实现Serializable接口
        2.使用对象流ObjectInputStream/ObjectOutputStream完成对象的序列化或反序列化
    ObjectOutputStream类:继承了OutputStream类
      构造函数:
        ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream。
      常用方法:
        writeObject(Object obj):将指定的对象写入 ObjectOutputStream。
        writeXxx(Xx x):Xxx对应的是基本数据类型:写入一个 xx 值。
        writeBoolean(boolean b) writeInt(int int) writeDouble(Double d)....
        flush():刷新该流的缓冲。
        close():关闭流。
    ObjectInputStream类:继承了InputStream类
      构造函数:
        ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream。
      常用的方法:
        readObject() : 从 ObjectInputStream 读取对象。
        readXxx():读取一个 xx 值。
        readInt() readDouble()....
        close(): 关闭输入流。

    public class Student implements Serializable{
        private static final long serialVersionUID = 1L;
        private String name;
        private int age;
        private double score;
        
        public Student() {
            
        }
        
        public Student(String name, int age, double score) {
            super();
            this.name = name;
            this.age = age;
            this.score = score;
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public double getScore() {
            return score;
        }
        public void setScore(double score) {
            this.score = score;
        }
        
    }
    public class TestObjectStream {
        public static void main(String[] args) {
            Student stu = new Student("zhangsan",20,80);
            File file = new File("D:/test.obj");
            try {
                //1.对象序列化
                OutputStream ops = new FileOutputStream(file);
                ObjectOutputStream oos = new ObjectOutputStream(ops);
                oos.writeObject(stu);//将stu对象写入指定位置 (序列化)
                oos.writeDouble(3.14);//将stu对象写入指定位置 (序列化)
                oos.flush();
                //2.反序列化
                InputStream ips = new FileInputStream(file);
                ObjectInputStream ois = new ObjectInputStream(ips);
                Student stu2 = (Student)ois.readObject();
                double pi =  ois.readDouble();
                System.out.println(stu2.getName()+"---"+stu2.getAge()+"---"+stu2.getScore());
                System.out.println("pi="+pi);
                //关闭资源
                oos.close();
                ops.close();
                ois.close();
                ips.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    只能保存对象的非静态成员变量
    不能保存任何成员方法和静态的成员变量
    不保存transient成员变量
    如果一个对象的成员变量是一个对象,这个对象的成员变量也会保存

    public class Dept implements Serializable{
        private int deptId;
        private String deptName;
        public Dept(){
            
        }
        public Dept(int deptId,String deptName){
            this.deptId= deptId;
            this.deptName=deptName;
        }
        
        public int getDeptId() {
            return deptId;
        }
        public void setDeptId(int deptId) {
            this.deptId = deptId;
        }
        public String getDeptName() {
            return deptName;
        }
        public void setDeptName(String deptName) {
            this.deptName = deptName;
        }
        
    }
    public class Employee implements Serializable{
        private int empId;
        private String empName;
        private transient int empAge; //使用transient修饰的属性,该属性不能被序列化
        private Dept dept;//封装了该员工对于的部门信息
        
        
        
        public Employee() {
            
        }
        
        public Employee(int empId, String empName, int empAge, Dept dept) {
            this.empId = empId;
            this.empName = empName;
            this.empAge = empAge;
            this.dept = dept;
        }
    
        public int getEmpId() {
            return empId;
        }
        public void setEmpId(int empId) {
            this.empId = empId;
        }
        public String getEmpName() {
            return empName;
        }
        public void setEmpName(String empName) {
            this.empName = empName;
        }
        public int getEmpAge() {
            return empAge;
        }
        public void setEmpAge(int empAge) {
            this.empAge = empAge;
        }
        public Dept getDept() {
            return dept;
        }
        public void setDept(Dept dept) {
            this.dept = dept;
        }
        
        
        
    }
    public class TestObjectStream2 {
        public static void main(String[] args) {
            Dept dept = new Dept(1,"讨账部");
            Employee employee = new Employee(1,"陈浩南",28,dept);
            Employee employee2 = new Employee(2,"山鸡",27,dept);
            
            try {
                //序列化
                FileOutputStream fos = new FileOutputStream("tt.o");
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                oos.writeObject(employee);
                oos.writeObject(employee2);
                //反序列化
                FileInputStream fis = new FileInputStream("tt.o");
                ObjectInputStream ois  =new ObjectInputStream(fis);
                Employee emp = (Employee)ois.readObject();
                System.out.println(emp.getEmpId()+"--"+emp.getEmpName()+"--"+emp.getEmpAge());
                Dept dept2 = emp.getDept();
                System.out.println(dept2.getDeptId()+"--"+dept2.getDeptName());
                Employee emp2 = (Employee)ois.readObject();
                System.out.println(emp2.getEmpId()+"--"+emp2.getEmpName()+"--"+emp2.getEmpAge());
                Dept dept3 = emp2.getDept();
                System.out.println(dept3.getDeptId()+"--"+dept3.getDeptName());
                
                //关闭流
                oos.close();
                fos.close();
                ois.close();
                fis.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    public class User implements Serializable{
        private String name;
        private int age;
        private Gender gender;
        public User(){
        }
        public User(String name, int age, Gender gender) {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
        
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public Gender getGender() {
            return gender;
        }
        public void setGender(Gender gender) {
            this.gender = gender;
        }
        @Override
        public String toString() {
            return "User [name=" + name + ", age=" + age + ", gender=" + gender + "]";
        }
    }
    //枚举
    enum Gender{
        男,女
    }
    public class TestObjectStream3 {
        public static void main(String[] args) {
            List<User> list = new ArrayList<User>();
            User user1 = new User("zhangsan",30,Gender.男);
            User user2 = new User("zhangsan2",24,Gender.男);
            User user3 = new User("zhangsan3",28,Gender.男);
            list.add(user1);
            list.add(user2);
            list.add(user3);
            try {
    //            序列化
                FileOutputStream fos = new FileOutputStream("D:/tt.o");
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                oos.writeObject(list);
                oos.flush();
                //反序列化
                FileInputStream fis = new FileInputStream("D:/tt.o");
                ObjectInputStream ois = new ObjectInputStream(fis);
                List<User> usersList = (List)ois.readObject();
                for (User user : usersList) {
                    System.out.println(user);
                }
                
                ois.close();
                fis.close();
                oos.close();
                fos.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            
        }
    }
  • 相关阅读:
    linux系统分区表修复
    centos 系统下彻底删除mysql
    mysql数据类型
    mysq 数据库基本管理
    centos 网卡聚合及Cisco交换机链路聚合
    Dell 服务器安装方法介绍
    linux分区之gpt(大于2T的分区)
    windows server 2008 远程桌面连接数修改--无限连接
    C# WinForm控件美化扩展系列之ListBox
    C# 文件 文件夹
  • 原文地址:https://www.cnblogs.com/fwdsz/p/6792419.html
Copyright © 2011-2022 走看看