Java IO流--对象流ObjectInputStream和ObjectOutputStream及对象序列化机制的理解

简介: Java IO流--对象流ObjectInputStream和ObjectOutputStream及对象序列化机制的理解

对象序列化机制:

允许把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流永久的保存到磁盘上,或通过网络将这种二进制流传输到另一个网络节点。(序列化)

当其他程序获取了这种二进制流,就可以恢复成原来的java对象。(反序列化)

序列化的理解:

  1. 序列化就是在保存数据时,保存数据的值和数据类型。
  2. 用ObjectOutputStream类保存基本数据类型或对象的机制。
  3. ObjectOutputStream提供了序列化的功能。

反序列化的理解:

  1. 反序列化就是在恢复数据时,恢复数据的值和数据类型。
  2. 用ObjectInputStream类读取基本数据类型或对象的机制。
  3. ObjectInputStream提供反序列化的功能。

一、对象流的使用一:ObjectOutputStream和ObjectInputStream

1.使用ObjectOutputStream进行序列化操作,具体代码如下:

/**
 * 演示ObjectOutputStream的使用,完成数据的序列化
 */
public class ObjectOutputStream_ {
    public static void main(String[] args) {
        //序列化后,保存的文件格式,不是存文本,而是按照它的格式来保存
        String filePath = "D:\\data.dat";
        ObjectOutputStream objectOutputStream = null;
        try {
            objectOutputStream = new ObjectOutputStream(new FileOutputStream(filePath));
            //序列化数据到D:\\data.dat
            objectOutputStream.writeInt(100); //int ->Integer(实现了Serializable接口)
            objectOutputStream.writeBoolean(true); //boolean->Boolean(实现了Serializable接口)
            objectOutputStream.writeDouble(90.5); //double->Double(实现了Serializable接口)
            objectOutputStream.writeUTF("筱路");
            //保存一个Dog对象
            objectOutputStream.writeObject(new Dog("小黄", 3));
            System.out.println("数据保存完毕(序列化形式)");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (objectOutputStream != null) {
                    objectOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2.使用ObjectInputStream进行反序列化操作,具体代码如下:

public class ObjectInputStream_ {
    public static void main(String[] args) {
        //指定反序列化的文件
        String filePath = "D:\\data.dat";
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream(filePath));
            //读取
            //1.读取(序列化)的顺序需要和你保存(序列化)的顺序一致
            //2.否则会出异常
            System.out.println(ois.readInt());
            System.out.println(ois.readBoolean());
            System.out.println(ois.readDouble());
            System.out.println(ois.readUTF());
            //dog的编译类型是Object,dog的运行类型是Dog
            Object dog = ois.readObject();
            System.out.println("运行类型=" + dog.getClass());
            System.out.println("dog信息=" + dog);
            //注意细节
            //1.如果我们希望调用Dog的方法,需要向下转型
            //2.需要我们将Dog类的定义,放在可以引用的位置
            Dog dog2 = (Dog) dog;
            System.out.println(dog2.getName());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                if (ois != null) {//关闭流,关闭外层流即可,底层会关闭FileInputStream流
                    ois.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

具体日志输出信息为:

100
true
90.5
筱路
运行类型=class file.outputStream_.Dog
dog信息=Dog{name='小黄', age=3}
小黄

二、对象流的使用二:ObjectOutputStream和ObjectInputStream

/**
     * 序列化过程:将内存中的java对象保存到磁盘中或通过网络传输出去
     * 使用ObjectOutputStream实现
     */
 @Test
    public void test1(){
        ObjectOutputStream oos = null;
        try {
            //造文件和处理流
            oos = new ObjectOutputStream(new FileOutputStream("object.dat"));
            //把数据写出到磁盘中
            oos.writeObject("程序员");
            oos.flush();//刷新操作
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (oos!=null){
                //关闭资源
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
  /**
     * 反序列化过程:将磁盘文件中的对象还原为内存中的一个java对象
     * 使用ObjectInputStream实现
     */
    @Test
    public void test2(){
        ObjectInputStream ois=null;
        try {
            //造文件和对象流
            ois = new ObjectInputStream(new FileInputStream("object.dat"));
            //把数据读入到内存中
            Object oj = ois.readObject();
            String s = (String) oj;
            System.out.println(s);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
           if (ois!=null){
               try {
                   ois.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
        }
    }


目录
相关文章
|
7月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
249 23
|
8月前
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
230 0
|
12月前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
326 57
|
11月前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
172 10
|
11月前
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
142 3
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
610 12
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
212 2
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。