IO_对象流


对象流

  对象的本质是用来组织和存储数据的,对象本身也是数据。那么,能不能将对象存储到硬盘上的文件中呢?能不能将对象通过网络传输到另一个电脑呢?我们可以通过序列化和反序列化实现。

java对象的序列化和反序列化

	当两个进程远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会议二进制的序列的形式在网络中传送。比如,我们可以通过http协议发送字符串信息;我们也可以在网络上直接发送java对象。发送方需要把这个java对象转换为字节序列化,才能在网络上传送;接收方则需要把字节序列恢复为java对象才能正常读取。
	把java对象转换为字节序列的过程为**对象的序列化**。字节序列话恢复为java对象的过程称为**对象的反序列化**。

** 对象序列化的作用有如下两种:**

  • 持久化 把对象的字节序列化永久的保存在硬盘上,通常存放在一个文件中
  • 网络通信 在网络上传送对象的字节序列。比如:服务器之间的数据通信/对象传递。

序列化涉及到的类和接口

	ObjectOutputStream代表对象输出流,它的writeObject(Object object)方法可对参数指定的obj对象进行序列化,把得到的字节序列化写到一个目标输出流中。
	ObjectInputStream 代表对象输入流,他的readObject()方法从一个源输入流中读取字节序列,再把他们反序列话一个对象,并将其返回。
	只有实现了Serializable接口的类的对昂才能被序列化。Serializable接口是一个空接口,只起到标记作用

对象流_写出基本的数据类型

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

/**
 * @author Mxhlin
 * @Email fuhua277@163.com
 * @Date 2022/08/29/20:32
 * @Version
 * @Description 对象流_写出基本的数据类型
 */
public class ObjectOutputStreamBasicTypeDemo {

    public static void main(String[] args) {
        ObjectOutputStreamBasicTypeDemo oosbt = new ObjectOutputStreamBasicTypeDemo();
        oosbt.objectOutputStream("D://IOTest//ma.txt");
    }

    /**
    * @Description: 写出基本的数据类型
    * @Param: [str]
    * @return: void
    * @Author: Mxhlin
    * @Date: 2022/8/29
    */
    public void objectOutputStream(String str){
        ObjectOutputStream oos = null;
        try {
                oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(str)));
                oos.writeInt(12);
                oos.writeChar('a');
                oos.writeBoolean(false);
                oos.writeDouble(12.0);
                oos.writeUTF("你好啊");// String 类型
                oos.flush();
        }catch (Exception e){
            e.fillInStackTrace();
        }finally {
            try {
                if (oos != null){
                    oos.close();
                }
            }catch (Exception e){
                e.fillInStackTrace();
            }
        }
    }
}

运行结果

在这里插入图片描述

对象流_读出基本的数据类型

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

/**
 * @author Mxhlin
 * @Email fuhua277@163.com
 * @Date 2022/08/29/20:47
 * @Version
 * @Description 对象流_读取基本的数据类型
 */
public class ObjectInputSteamBasicTypeDemo {

    public static void main(String[] args) {
        ObjectInputSteamBasicTypeDemo oisbtd = new ObjectInputSteamBasicTypeDemo();
        oisbtd.objectInputStream("D://IOTest//ma.txt");
    }

    /**
    * @Description: 读取基本的数据类型
    * @Param: [ste]
    * @return: void
    * @Author: Mxhlin
    * @Date: 2022/8/29
    */
    public void objectInputStream(String ste){
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(ste)));
            System.out.println("Int: "+ois.readInt());
            System.out.println("Char: "+ois.readChar());
            System.out.println("Boolean: "+ois.readBoolean());
            System.out.println("Double: "+ois.readDouble());
            System.out.println("String: "+ois.readUTF());
        }catch (Exception e){
            e.fillInStackTrace();
        }finally {
            try {
                if (ois != null){
                    ois.close();
                }
            }catch (Exception e){
                e.fillInStackTrace();
            }
        }
    }
}

在这里插入图片描述

对象流_将对象序列化到文件

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

/**
 * @author Mxhlin
 * @Email fuhua277@163.com
 * @Date 2022/08/29/21:22
 * @Version
 * @Description 对象流_将对象序列化到文件
 */
public class ObjectOutputStreamObjectDemo {

    public static void main(String[] args) {
        ObjectOutputStreamObjectDemo oosod = new ObjectOutputStreamObjectDemo();
        oosod.objectOutputStream("D://IOTest//木木.txt");
    }

    /**
    * @Description: 将对象序列化到文件
    * @Param: [str]
    * @return: void
    * @Author: Mxhlin
    * @Date: 2022/8/29
    */
    public void objectOutputStream(String str){
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream(str));
            User user = new User(1,"木木","18");
            oos.writeObject(user);
            oos.flush();
        }catch (Exception e){
            e.fillInStackTrace();
        }finally {
            try {
                if (oos != null){
                    oos.close();
                }
            }catch (Exception e){
                e.fillInStackTrace();
            }
        }
    }
}

运行结果
在这里插入图片描述

对象流_将对象反序列化内存

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

/**
 * @author Mxhlin
 * @Email fuhua277@163.com
 * @Date 2022/08/29/21:38
 * @Version
 * @Description 对象流_将对象反序列化内存
 */
public class ObjectInputStreamObjectTpeyDemo {

    public static void main(String[] args) {
        ObjectInputStreamObjectTpeyDemo ooo = new ObjectInputStreamObjectTpeyDemo();
        ooo.ObjectInputStream("D://IOTest//木木.txt");
    }

    /**
    * @Description: 将对象反序列化内存
    * @Param: [str]
    * @return: void
    * @Author: Mxhlin
    * @Date: 2022/8/29
    */
    public void ObjectInputStream(String str){
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream(str));
            User user = (User)ois.readObject();
            System.out.println(user.getUserId());
            System.out.println(user.getUserName());
            System.out.println(user.getUserAge());
        }catch (Exception e){
            e.fillInStackTrace();
        }finally {
            try {
                if (ois != null){
                    ois.close();
                }
            }catch (Exception e){
                e.fillInStackTrace();
            }
        }
    }
}

运行结果

在这里插入图片描述

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/java/282924.html

(0)
上一篇 2022年8月29日 22:01
下一篇 2022年8月29日 22:12

相关推荐

发表回复

登录后才能评论