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

目录
相关文章
|
9月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
345 1
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
507 14
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
715 5
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
352 0
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
800 0
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
9月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
429 1
|
9月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
396 1
|
JSON Java 数据库连接
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。