IO流学习07(Java)

news2024/11/29 12:39:16

序列化流(对象操作输出流):

可以把java中的对象写到本地文件中。

public objectoutputstream(outputstream out)    把基本流包装成高级流。

public final void writeobject(object obj)    把对象序列化(写出)到文件中去。

细节:使用序列化流将对象保存到文件时会出现NotSerializableException异常,可以采取让javabean类实现Serializable接口来解决问题。

Serializable接口里面时没有抽象方法的,是一个标记型接口,一旦实现了这个接口,那么就表示当前类可以被序列化。

案例需求:利用序列化流,把一个对象写到本地文件中。

代码实现:

package com.zhou.myobjectstream;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class ObjectStreamDemo01 {
    public static void main(String[] args) throws IOException {
        /*需求:利用序列化流,把一个对象写到本地文件中*/

        //1.创建对象
        Student stu = new Student("张三",23);

        //2.创建序列化流的对象
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\IdeaFile\\MyIO\\AnLi.txt"));

        //3.写出数据
        oos.writeObject(stu);

        //4.释放资源
        oos.close();
    }
}

再写一个Student类:

package com.zhou.myobjectstream;

import java.io.Serializable;

public class Student implements Serializable {
    public Student(){

    }
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String toString(){
        return "Student{name = " + name + ", age = " + age + "}";
    }

    private String name;
    private int age;

}

运行结果:

此时,Student类便被序列化后被保存到了文件当中。

反序列化流:

可以把序列化到本地文件中的对象,去读到程序中来。

public objectInputstream( Inputstream out)    把基本流变成高级流

public object readobject()    把序列化到本地文件中的对象,读取到程序中来

案例需求:利用序列化流,把一个本地文件职中的对象读到程序中。

代码实现:

package com.zhou.myobjectstream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectStreamDemo02 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        /*利用序列化流,把一个本地文件职中的对象读到程序中。*/

        //1.创建反序列化流的对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\IdeaFile\\MyIO\\AnLi.txt"));

        //2.读取数据
        Object o = ois.readObject();

        //3.打印对象
        System.out.println(o);

        //4.关闭资源
        ois.close();
    }
}

注意:读取到的数据是Object类型的!如果想要真正的Stdent类,还需要做一个强转。

Student o = (Student) ois.readObject();

其运行结果是一致的。

序列化流及反序列化流使用细节:

在建好对象后,使其实现Serializable接口,再对其实现序列化将其保存到本地文件当中,当我们修改对象时,再使用反序列化将其从本地文件以对象的形式读到程序当中,会出下报错,这是因为每一次序列化,都会根据对象中所包含的所有成员生成一个版本号,序列化后,文件当中也会包含这个版本号此时,如果修改了java文件,会导致文件中的版本号和JavaBean的版本号不匹配,从而报错。

因为在实际开发中,必须根据业务对Javabean进行修改,所以不更改JavaBean是不可能的,所以解决方案应该是,固定一个版本号。

版本号命名格式:private static final long serialVersionUID = 1L;

如果有在JavaBean文件中,有不想被序列化的成员变量,可以在成员变量前面加上transient(瞬态)关键字。

transient的作用:不会把当前属性序列化到本地文件当中。

练习:

将多个自定义对象序列化到文件中,但是对象的个数不确定,该如何操作呢?

可以将对象全部放到ArrayList集合当中,对ArrayList序列化,在读的时候只需要对集合实现遍历即可。

接下来实现:

先写好一个对象:

package com.zhou.myobjectstream;

import java.io.Serializable;

public class Teacher implements Serializable {
    private static final long serialVersionUID = -1108545422521561957L;

    public Teacher(){

    }
    public Teacher(String name,String sex,int age){
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Teacher{" + "name='" + name + '\'' + ", sex='" + sex + '\'' + ", age=" + age + '}';
    }

    private String name;
    private String sex;
    private int age;

}

序列化流:

package com.zhou.myobjectstream;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Array;
import java.util.ArrayList;

public class ObjectStreamDemo03 {
    public static void main(String[] args) throws IOException {
        Teacher t1 = new Teacher("章程","男",41);
        Teacher t2 = new Teacher("李元","男",36);
        Teacher t3 = new Teacher("周强","男",57);
        ArrayList<Teacher> list = new ArrayList<>();
        list.add(t1);
        list.add(t2);
        list.add(t3);

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\IdeaFile\\MyIO\\XuLie.txt"));
        oos.writeObject(list);
        oos.close();

    }
}

反序列化流,读取对象:

package com.zhou.myobjectstream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;

public class ObjectStreamDemo04 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\IdeaFile\\MyIO\\XuLie.txt"));
        ArrayList<Teacher> list = (ArrayList<Teacher>)ois.readObject();
        for(Teacher teacher : list){
            System.out.println(teacher);
        }
        ois.close();

    }
}

另外准备好一个本地文件用于保存JavaBean文件:

运行结果:

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/741467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Docker和Kubernetes中使用代理IP?

Docker和Kubernetes是目前非常流行的容器化技术&#xff0c;这些技术被广泛用于开发、部署和管理应用程序。在某些情况下&#xff0c;需要使用代理IP来访问特定的网络资源。本文将介绍如何在Docker和Kubernetes中使用代理IP&#xff0c;并提供详细的举例说明。 一、在Docker中使…

如何增强农业防灾减灾能力,加强灾情监测与风险预估

近日&#xff0c;农业农村部会同各部门联合下发通知&#xff0c;要求各地坚持问题导向&#xff0c;分区分类指导&#xff0c;细化实化措施&#xff0c;千方百计夺取秋粮和全年粮食丰收。文件中提到要通过加强灾害风险预报预警和灾情监测调度、分区分类做好灾情防范应对来应对气…

ASEMI整流桥GBU808参数和应用

编辑-Z 整流桥GBU808是一种常见的电子元件&#xff0c;用于将交流电转换为直流电。它由四个二极管组成&#xff0c;可以全波整流。GBU808具有高电流和高电压的特点&#xff0c;适用于各种电源和电路应用。 GBU808的主要特点之一是其高电流能力。它可以承受高达8安培的电流&…

嵌入式开发之串口通讯

串口通信(Serial Communication)&#xff0c; 是指外设和计算机间&#xff0c;通过数据信号线 、地线、控制线等&#xff0c;按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少&#xff0c;在远距离通信中可以节约通信成本&#xff0c;但其传输速度比并行传输低&…

springboot会员制医疗预约服务管理信息系统

针对会员制医疗预约服务行业的管理现状&#xff0c;本会员制医疗预约服务管理信息系统主要实现以下几个目标&#xff1a; 1.系统界面简洁&#xff0c;操作简便。 2.拥有精准&#xff0c;高效的查询功能。 3.使管理人员能够及时的获得精确的报表。 4.对数据…

docker入门(Linux环境下安装Docker,Docker构建镜像)

docker入门(利用docker部署web应用) 一:什么是Docker 1.1 官方解释 Docker is the world’s leading software containerization platform。 Docker公司开发&#xff0c;开源&#xff0c;托管在github跨平台&#xff0c; 支持Windows、Macos、Linux。 1.2 抽象解释 docker…

【状态设计优化DP】ABC307 E

E - Distinct Adjacent (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 组合问题&#xff0c;考虑DP或组合数 组合数不好考虑&#xff0c;我们去考虑DP 因为是个环&#xff0c;我们把环拆成一条链&#xff0c;然后加一个N1&#xff0c;颜色和起点1相同&#xff0c;在这条…

天台玻璃折叠门可实现室内外空间的无缝连接

天玻璃折叠门是指安装在天台上的可折叠开合的玻璃门&#xff0c;可用于将室外空间与室内空间进行隔离或连接。设计天台玻璃折叠门时需要注意以下几点&#xff1a; 1. 结构稳固性&#xff1a;选择坚固、稳定的材料和结构设计&#xff0c;确保门体在风力和其他外力作用下不易摇晃…

如何规范的设计数据库表

前言对于后端开发同学来说&#xff0c;访问数据库&#xff0c;是代码中必不可少的一个环节。系统中收集到用户的核心数据&#xff0c;为了安全性&#xff0c;我们一般会存储到数据库&#xff0c;比如&#xff1a;mysql&#xff0c;oracle等。后端开发的日常工作&#xff0c;需要…

制作搭建宠物商城小程序,打造便捷的宠物购物体验

随着宠物市场的不断发展&#xff0c;宠物商城小程序成为了满足宠物爱好者需求的重要工具。在现代社会&#xff0c;宠物已经成为人们生活中不可或缺的一部分。作为宠物爱好者&#xff0c;我们对于宠物食品、用品、医疗保健品等需求日益增长。而宠物商城小程序则为我们提供了一个…

python_day5_file

open()打开函数&#xff1a; f open(name,mode,encoding) name:要打开的目标文件名 mode:访问模式&#xff1a;只读r、写入w、追加a 等 encoding:编码格式&#xff0c;常为UTF-8 f open("D:\Test.txt", "r", encoding"UTF-8") print(type(f))r…

Dbeaver 显示字段备注信息

一、全局设置显示字段描述

@所有人,酷雷曼年中答卷,请查收!

2023 酷雷曼VR年中答卷 顺势而行 携手共赢 七月既至&#xff0c;年过已半。 半年来&#xff0c; 我们持续以优质的产品研发、 专业的客户服务、 不断交付的技术方案&#xff0c; 将那些关于VR的美好向往&#xff0c; 变成真实可感的确定&#xff0c; 让每一种相信&am…

Vue+element实现el-table行内编辑并校验

el-table行内编辑情况情况概要&#xff1a;之前在开发过程中对于element数据的新增&#xff0c;修改&#xff0c;删除。一般直接结合el-form使用。也就是新增的时候点新增然后出来一个弹框&#xff0c;里面嵌套一个表单&#xff0c;然后保存就好了。这次项目中要求所有的新增&a…

如何学习编写安全的PHP代码? - 易智编译EaseEditing

学习编写安全的PHP代码是保证应用程序安全的重要一环。下面是几个建议来帮助你学习编写安全的PHP代码&#xff1a; 学习安全编程原则&#xff1a; 了解常见的安全漏洞类型&#xff0c;如跨站脚本攻击&#xff08;XSS&#xff09;、SQL注入、跨站请求伪造&#xff08;CSRF&…

如何刷新对黑客的认识?

黑客一般有10种类型 1、白帽黑客 白帽黑客是指通过实施渗透测试&#xff0c;识别网络安全漏洞&#xff0c;为政府及组织工作并获得授权或认证的黑客。他们也确保保护免受恶意网络犯罪。他们在政府提供的规章制度下工作&#xff0c;这就是为什么他们被称为道德黑客或网络安全专…

springboot项目中引入本地依赖jar包,并打包到lib文件夹中

1.springboot项目中引入本地依赖jar包&#xff0c;并打包到lib文件夹中 描述&#xff1a;下载了第三方相关jar包后&#xff0c;项目中引入本地jar&#xff0c;测试环境正常&#xff0c;打包线上报错提示为找到该jar 原因&#xff1a;应该在/WEB-INF/lib/xxx.jar&#xff0c;被…

vite-plugin-mock配置报错“localEnabled”不在类型”ViteMockOptions”中

vue3vite安装vite-plugin-mock之后配置报错&#xff1a; “localEnabled”不在类型”ViteMockOptions”中。 在vite.config.ts中共添加viteMockServe({ localEnabled: command ‘serve’, }),之后报了一下错误&#xff1a; 解决方法&#xff1a;与vite-plugin-mock版本有关&a…

揭示Android黑客之道:通过逆向工程揭开HTTPS流量

抓包是指在计算机网络中&#xff0c;通过监听网络流量并捕获通信数据包的过程。在网络通信中&#xff0c;数据以数据包的形式在网络上进行传输&#xff0c;每个数据包包含了源地址、目标地址、协议信息以及实际的数据内容。 抓包可以帮助我们了解网络通信的细节&#xff0c;包…

linux开发工具:Git

文章目录 1&#xff1a;Git简介2&#xff1a;Git简明指南2.1&#xff1a;创建新仓库2.2&#xff1a;检出仓库2.3&#xff1a;工作流2.4&#xff1a;添加和提交2.5&#xff1a;推送改动2.6&#xff1a;分支2.7&#xff1a;更新与合并2.8&#xff1a;标签2.9&#xff1a;替换本地…