java中的IO流之序列化与反序列化(对象数据和文件的读写交互)

简介: 在之前的IO流中,都是内存与磁盘进行交互的读写,要传输只能在本地上进行传输。想要在网络上进行传输,那就要通过进行对象的传输,java万物皆对象嘛。

一、知识点介绍

1.什么是序列化与反序列化?

对象与磁盘的交互读写。

2.为什么要学?

2.1在之前的IO流中,都是内存与磁盘进行交互的读写,要传输只能在本地上进行传输。想要在网络上进行传输,那就要通过进行对象的传输,java万物皆对象嘛。

2.2更好的保存数据,防止数据的丢失。

3.序列化与反序列化?

序列化(对象字节输出流--即写入数据):Java对象数据写入到磁盘文件中。

反序列化(对象字节输入流--即读取数据):读取磁盘文件中的Java对象数据。

4.对象数据?

来自idea里面的中产生的Java数据。

二、例子

1.序列化(ObjectOutputStream)------写入磁盘文件

把代码2的数据通过代码1写入到磁盘文件中。

操作代码1(重点):

package bao;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Test {
    public static void main(String[] args) throws IOException {
        //1.创建学生对象并写入数据
        Student s = new Student("故人","yu","9477",18);
        //2.使用对象序列化把对象数据写入到指定磁盘文件中去
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("D:\\java_base\\SE\\src\\bao\\风花雪月.txt"));//原先文件夹是空的
        //3.调用序列化方法
        os.writeObject(s);
        os.close();//关闭流
    }
}
//对象那边一定要实现implements Serializable接口

被测试的对象代码2(可看可不看):

package bao;
import java.io.Serializable;
public class Student implements Serializable {//这个implements Serializable接口一定不能忘记,要不然会报错的
    //1.创建对象元素
    private String name;
    private String loginName;
    private transient String passWord;//加入了transient,就不参与序列化。别人就获取不到信息。保护了数据安全
    private int age;
//2.生成set和get方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLoginName() {
        return loginName;
    }
    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
//3.生成的有参构造器
    public Student(String name, String loginName, String passWord, int age) {
        this.name = name;
        this.loginName = loginName;
        this.passWord = passWord;
        this.age = age;
    }
//4.生成无参构造器
    public Student() {
    }
//5.生成toString方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", loginName='" + loginName + '\'' +
                ", passWord='" + passWord + '\'' +
                ", age=" + age +
                '}';
    }
}
//生成的快捷键在其他文章中有

运行结果(这是运行成功的,我们看不懂很正常,这是给磁盘看的):



2.反序列化(ObjectInputStream)------读取磁盘文件

把磁盘文件中存入的对象数据读取出来。取例:读取上述"风花雪月"的对象数据出来

package bao;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1.创建要读取文件数据的对象(文件中存的数据是对象数据)
        ObjectInputStream is = new ObjectInputStream(new FileInputStream("D:\\java_base\\SE\\src\\bao\\风花雪月.txt"));//放入要读取的文件地址
        //2.调用反序列化方法
        Object s = is.readObject();
        System.out.println(s);
    }
}

运行结果:

Student{name='故人', loginName='yu', passWord='null', age=18}


注意点:这个读取的文件来源是上一题(被序列化后的磁盘文件"风花雪月")


旁白:在里面用到了三份文件。


序列化:把对象文件(学生对象)写入到磁盘文件(风花雪月)中 。


反序列化:把磁盘文件(风花雪月)读取出来。


1.其实用到这个也就是为了保存我们开发中的数据保存到磁盘文件中去,防止丢失,还有网络传输对象数据会用到这个。


2.这个就是读写磁盘文件嘛,和之前不同的是,这个读写的是idea里面产生的数据文件,比如一个系统中的用户信息等。


额外扩展知识:要保护一些隐私数据防止其他人读取。就在要保护隐私的数据后面加上transient



所以上面运行出来的passWord就显示为null了。

目录
相关文章
|
21天前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
18天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
49 2
|
21天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
44 2
|
21天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
26 2
|
26天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
41 2
|
1月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
37 4
|
1月前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
42 2
|
1月前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
16 0
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。