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了。

目录
相关文章
|
2月前
|
前端开发 JavaScript Java
java常用数据判空、比较和类型转换
本文介绍了Java开发中常见的数据处理技巧,包括数据判空、数据比较和类型转换。详细讲解了字符串、Integer、对象、List、Map、Set及数组的判空方法,推荐使用工具类如StringUtils、Objects等。同时,讨论了基本数据类型与引用数据类型的比较方法,以及自动类型转换和强制类型转换的规则。最后,提供了数值类型与字符串互相转换的具体示例。
103 3
|
1天前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
32 18
|
6天前
|
存储 弹性计算 固态存储
阿里云服务器ESSD Entry系统盘测评IOPS、IO读写和时延性能参数
阿里云ESSD Entry云盘是新一代企业级云盘,具备高IOPS、低延迟特性,适合开发与测试场景。它提供10~32,768 GiB容量范围,最大IOPS达6,000,吞吐量150 MB/s,时延1~3 ms。支持按量付费和包年包月,性价比高,特别适合个人开发者和中小企业。详情及价格参考阿里云官网。
|
13天前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
28 1
|
18天前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
38 7
|
1月前
|
存储 Java BI
java怎么统计每个项目下的每个类别的数据
通过本文,我们详细介绍了如何在Java中统计每个项目下的每个类别的数据,包括数据模型设计、数据存储和统计方法。通过定义 `Category`和 `Project`类,并使用 `ProjectManager`类进行管理,可以轻松实现项目和类别的数据统计。希望本文能够帮助您理解和实现类似的统计需求。
80 17
|
3月前
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
42 3
|
Java 大数据 Apache
|
Java Windows 移动开发