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月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
297 0
|
2月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
184 1
|
4月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
4月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
4月前
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
4月前
|
存储 人工智能 JavaScript
Java从作用域到对象高级应用​
本内容详细讲解了JavaScript中的作用域类型(函数作用域、块作用域、全局作用域)、作用域链、垃圾回收机制、闭包、变量提升、函数参数、数组方法、内置构造函数、对象高级知识、原型链、对象赋值、深浅拷贝、递归、异常处理及this指向等内容,全面覆盖JS核心概念与编程技巧。
57 0
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
174 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
198 1
|
6月前
|
存储 Java 编译器
说一说关于序列化/反序列化中的细节问题
我是小假 期待与你的下一次相遇 ~
111 1
|
6月前
|
JSON Java 数据库连接