java IO流(四) 数据流 序列化流

news2024/11/25 22:49:47

请添加图片描述

数据流

再学习一种流,这种流在开发中偶尔也会用到,我们想把数据和数据的类型一并写到文件中去,读取的时候也将数据和数据类型一并读出来。这就可以用到数据流,有两个DataInputStream和DataOutputStream.

DataOutputStream类 写入特定类型
DataOutputStream类,它也是一种包装流,创建DataOutputStream对象时,底层需要依赖于一个原始的OutputStream流对象。然后调用它的wirteXxx方法,写的是特定类型的数据。

请添加图片描述

代码如下:往文件中写整数、小数、布尔类型数据、字符串数据

public class DataOutputStreamTest1 {
    public static void main(String[] args) {
        try (
                // 1、创建一个数据输出流包装低级的字节输出流
                DataOutputStream dos =
                        new DataOutputStream(new FileOutputStream("io-app2/src/10out.txt"));
                ){
            dos.writeInt(97);
            dos.writeDouble(99.5);
            dos.writeBoolean(true);
            dos.writeUTF("666");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
//运行完之后666前面显示的是乱码,但其实不是发生了编码错误,而是一种特定的数据存储方式
//因为本来就不是存给人看的,而是方便下次读取的

DataInputStream类 读取特定类型
DataIntputStream类,它也是一种包装流,用于读取数据输出流输出的数据。创建DataInputStream对象时,底层需要依赖于一个原始的InputStream流对象。然后调用它的readXxx()方法就可以读取特定类型的数据。

请添加图片描述

代码如下:读取文件中特定类型的数据(整数、小数、字符串等)

public class DataInputStreamTest2 {
    public static void main(String[] args) {
        try (
                DataInputStream dis =
                        new DataInputStream(new FileInputStream("io-app2/src/10out.txt"));//文件是上面数据输出流输出的文件
                ){
            int i = dis.readInt();
            System.out.println(i);//97

            double d = dis.readDouble();
            System.out.println(d);//99.5

            boolean b = dis.readBoolean();
            System.out.println(b);//true

            String rs = dis.readUTF();
            System.out.println(rs);//"666"
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


请添加图片描述

序列化流

序列化流是干什么用的呢? 我们知道字节流是以字节为单位来读写数据、字符流是按照字符为单位来读写数据、而对象流是以对象为单位来读写数据。也就是把对象当做一个整体,可以写一个对象到文件,也可以从文件中把对象读取出来。这里有一个新词 序列化
序列化:意思就是把对象写到文件或者网络中去。(简单记:写对象)
反序列化:意思就是把对象从文件或者网络中读取出来。(简单记:读对象)

ObjectOutputStraem类 写对象
ObjectOutputStream流,它也是一个包装流,不能单独使用,需要结合原始的字节输出流使用,支持写任意的java对象出去。

请添加图片描述

代码如下:将一个User对象写到文件中去
第一步:先准备一个User类,必须让其实现Serializable接口。

// 注意:对象如果需要序列化,必须实现序列化接口。
public class User implements Serializable {
    private String loginName;
    private String userName;
    private int age;
    // transient 这个成员变量将不参与序列化,即某个对象被写到文件后再读取,这个字段就是null了。
    private transient String passWord;

    public User() {
    }

    public User(String loginName, String userName, int age, String passWord) {
        this.loginName = loginName;
        this.userName = userName;
        this.age = age;
        this.passWord = passWord;
    }

    @Override
    public String toString() {
        return "User{" +
                "loginName='" + loginName + '\'' +
                ", userName='" + userName + '\'' +
                ", age=" + age +
                ", passWord='" + passWord + '\'' +
                '}';
    }
}

第二步:再创建ObjectOutputStream流对象,调用writeObject方法对象到文件。

public class Test1ObjectOutputStream {
    public static void main(String[] args) {
        try (
                // 2、创建一个对象字节输出流包装原始的字节 输出流。
                ObjectOutputStream oos =
                        new ObjectOutputStream(new FileOutputStream("io-app2/src/11out.txt"));
                ){
            // 1、创建一个Java对象。
            User u = new User("admin", "张三", 32, "666888xyz");

            // 3、序列化对象到文件中去
            oos.writeObject(u);
            System.out.println("序列化对象成功!!");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意:写到文件中的对象,是不能用记事本打开看的。因为对象本身就不是文本数据,打开是乱码,这里必须用反序列化,自己写代码读。

请添加图片描述


ObjectInputStream类 读对象
ObjectInputStream流,它也是一个包装流,不能单独使用,需要结合原始的字节输入流使用,可以读任意的java对象。

请添加图片描述

接着前面的案例,文件中已经有一个Student对象,现在要使用ObjectInputStream读取出来。称之为反序列化。

public class Test2ObjectInputStream {
    public static void main(String[] args) {
        try (
            // 1、创建一个对象字节输入流管道,包装 低级的字节输入流与源文件接通
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("io-app2/src/itheima11out.txt"));
        ){
            User u = (User) ois.readObject();
            System.out.println(u);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

PS:

请添加图片描述

请添加图片描述

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

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

相关文章

JS 方法实现复制粘贴

背景 以前我们一涉及到复制粘贴功能,实现思路一般都是: 创建一个 textarea 标签 让这个 textarea 不可见(定位) 给这个 textarea 赋值 把这个 textarea 塞到页面中 调用 textarea 的 select 方法 调用 document.execCommand…

Java逻辑控制

目录 一、顺序结构 二、分支结构 1、if语句 (1) 语法格式1​编辑 (2)语法格式2​编辑 (3)语法格式3 2、switch 语句 三、循环结构 1、while循环 2、break 3、continue 4、for 循环 5、do whil…

Pycharm通用设置个性化设置

Pycharm通用设置&个性化设置 通用设置取消打开Pycharm自动进入项目开启【Ctrl鼠标滑轮】放大缩小字体 个性化设置设置彩虹括号 通用设置 取消打开Pycharm自动进入项目 选择选择菜单【File】>【Settings】进入设置页面选择【Appearance & Behavior】>【System S…

dantax参数调优

dantax参数调优 1.speed调优 可能会导致数据倾斜 处理的速度不同,可能会导致job非常慢 举例子,比如总限速是每秒100条record,其中第一个channel速度是每秒99条record,第二个channel是每秒1条record,加起来是每条100条…

Helm Deploy Online Rancher Demo

文章目录 简介预备条件在线安装 Rancher Helm Chart选择 SSL 配置安装 cert-managerHelm 安装 Rancher验证 Rancher Server 是否部署成功 简介 Rancher 是一个开源的企业级全栈化容器部署及管理平台。已有超过 1900 万次下载,4000 生产环境的应用。 简单的说&…

医院如何选择跨网文件交换产品,提升业务效率?

我国医院根据国家信息安全相关法规要求,大多都采用网闸等隔离手段,将网络隔离为内网和外网,但网络隔离后,医院仍需要进行内外网间的文件交换,如患者的检测报告、学术研究等资料。而医院内的不同科室都存在内外网文件交…

被动元件库存“见底”,或迎涨价潮? | 百能云芯

近日,有消息称被动元件可能会涨价,这促使了被动元件相关股票的全面上涨。国内相关供应链表示,虽然目前没有涨价的条件,但经过长时间的库存消化,各种应用的库存几乎已经清空,只等待终端需求的回升。 自2021年…

软件测试/测试开发丨测试用例自动录入 学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27139 测试用例自动录入 测试用例自动录入的价值 省略人工同步的步骤,节省时间 兼容代码版本的自动化测试用例 用例的执行与调度统一化管理…

STM32--蓝牙

本文主要介绍基于STM32F103C8T6和蓝牙模块实现的交互控制 简介 蓝牙(Bluetooth)是一种用于无线通信的技术标准,允许设备在短距离内进行数据交换和通信。它是由爱立信(Ericsson)公司在1994年推出的,以取代…

【前端打怪升级日志之CSS篇】position定位

学习链接:阮一峰CSS定位详解 学习总结: 学习应用:待补充。。。

阿里云再推视频生成大模型,2分钟生成高清电影级效果视频

近日,阿里云推出全新视频生成大模型I2VGen-XL,并在魔搭社区开放体验,用户上传一张图片后2分钟左右即可生成一段1280*720的高分辨率视频,该模型研发负责人表示,未来将进一步实现2K超清效果,可应用于短视频内…

懂点心理学 - 踢猫效应

懂点心理学,生活工作两不误~ 什么是踢猫效应 某公司董事长为了重整公司事务,许诺自己将早到晚归。有一次,他在家看报太入迷以至于忘记了时间,为了不迟到,他在公路上超速驾驶,结果被警察开了罚单…

Vue + Element UI 实现权限管理系统 前端篇(十四):菜单功能实现菜

Vue Element UI 实现权限管理系统 前端篇(十四):菜单功能实现 菜单功能实现 菜单接口封装 菜单管理是一个对菜单树结构的增删改查操作。 提供一个菜单查询接口,查询整颗菜单树形结构。 http/modules/menu.js 添加 findMenu…

微信公众号开发:Vue3+Pinia

步骤一:绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 步骤二:引入JS文件 在需要调用JS接口 :http://res.wx.qq.com/open/js/jweixin-1.6.0.js npm install weixin-js-sdk 这里报错了。 //…

语音识别数据的采集方法:基本流程数据类型

“人工智能是一种模仿人类功能的产品。数据采集的方法需要针对特定的场景需求。”—–Mark Brayan (澳鹏CEO) 我们一直说,对于一个高质量的人工智能产品离不开高质量的训练数据。对于不同的人工智能我们需要不同的数据对其训练。要采集正确的数据去训练特定的模型才…

float浮动布局大战position定位布局

华子目录 布局方式普通文档流布局浮动布局(浮动主要针对与black,inline元素)float属性浮动用途浮动元素父级高度塌陷 position属性定位篇相对定位(relative为属性值,配合left属性,和top属性使用&#xff09…

快速理解DDD领域驱动设计架构思想-基础篇 | 京东物流技术团队

1 前言 本文与大家一起学习并介绍领域驱动设计(Domain Drive Design) 简称DDD,以及为什么我们需要领域驱动设计,它有哪些优缺点,尽量用一些通俗易懂文字来描述讲解领域驱动设计,本篇并不会从深层大论述讲解落地实现,这…

抄底抄在半山腰?散户如何摆脱追涨杀跌的诅咒?【邢不行】

你第一次炒股的经历是不是这样的: 你有一个朋友甚至是群友,他说在XX股票上大赚了一笔,你听后是既羡慕又不服。 于是你下载了炒股软件,看了眼这只股票,有点心动。但是由于没有交易经验,股价又确实涨了不少…

【实战-06】正确设置flink参数,彻底站起来

参数宝典 如何正确设置参数flink Table模式下的参数Table 模式下参数类相关DataStream 模式下怎么设置参数?总结 如何正确设置参数 很多人在应用flink DataStream 或者是Flinksql 的时候对于一些参数设置知道的不是很清晰,本文带领大家彻底搞定这一块。…

企业微信自建应用开发流程

开发需知 1、企业微信后台管理(不是小程序管理后台):企业微信 2、企业微信开发者文档(不是小程序文档):概述 - 接口文档 - 企业微信开发者中心 3、开发应用的类型:根据开发应用类型选择文档。…