【从入门到起飞】IO高级流(1)(缓冲流,转换流,序列化流,反序列化流)

🎊专栏【JavaSE】
🍔喜欢的诗句:天行健,君子以自强不息。
🎆音乐分享【如愿】
🎄欢迎并且感谢大家指出小吉的问题🥰

文章目录

  • 🎄缓冲流
    • 🍔字节缓冲流
      • 🛸一次读取一个字节
      • 🛸一次读取多个字节
    • 🍔字符缓冲流
  • 🎄转换流
    • 🍔利用转换流按照指定的字符编码读取数据
    • 🍔利用转换流按照指定的字符编码写入数据
    • 🍔读写结合,使用转换流读取数据并且写入数据,并且转换编码方式
      • 🛸乱码的解决方法
  • 🎄序列化流(对象操作输出流)
    • 🍔写出一个对象
      • 🛸创建类Student.java
      • 🛸创建类Demo1.java
  • 🎄反序列化流(对象操作输入流)
    • 🌺小练习——读写多个对象
      • 🛸创建类Student.java
      • 🛸创建类Write.Java
      • 🛸创建类Read.Java
        • 🎈结果

在这里插入图片描述

🎄缓冲流

在这里插入图片描述

在代码中使用缓冲流(Buffered Streams)有许多好处,特别是在处理I/O操作时,它们可以显著提高性能和效率。缓冲流是一种在内存中创建缓冲区的I/O流,可以将数据暂时存储在缓冲区中,然后一次性地进行批量读取或写入,而不是每次操作都直接与底层数据源(如文件、网络套接字等)交互。

🍔字节缓冲流

原理:底层自带了长度为8192的缓冲区来提高性能

请添加图片描述
在创建对象的时候还是使用原来的基本流,但是在缓冲流的加持下,提高了基本流读写的效率

🛸一次读取一个字节

package IODemo1;import java.io.*;public class Demo2 {public static void main(String[] args) throws IOException {//创建缓冲流对象BufferedInputStream bis=new BufferedInputStream(new FileInputStream("G:\\a.txt"));BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("G:\\copy.txt"));//循环读写到目的地int b;while ((b=bis.read())!=-1){bos.write(b);}bos.close();bis.close();}}

在这里插入图片描述

🛸一次读取多个字节

package IODemo1;import java.io.*;public class Demo2 {public static void main(String[] args) throws IOException {//创建缓冲流对象BufferedInputStream bis = new BufferedInputStream(new FileInputStream("G:\\a.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("G:\\copy.txt"));//循环读写到目的地byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}//释放资源bos.close();bis.close();}}

在这里插入图片描述

🍔字符缓冲流

在这里插入图片描述
在这里插入图片描述

为什么文件有三行数据,但是读出的只有一行呢
因为readline在读取的时候,一次只读一整行,读到回车换行符结束

如何把文件全部都读出来

package IODemo1;import java.io.*;public class Demo2 {public static void main(String[] args) throws IOException {BufferedReader br=new BufferedReader(new FileReader("G:\\a.txt"));String line;while (((line=br.readLine())!=null)){System.out.println(line);}br.close();}}

在这里插入图片描述

🎄转换流

转换流是字符流和字节流之间的桥梁
在这里插入图片描述

🍔利用转换流按照指定的字符编码读取数据

读取数据

在这里插入图片描述

🍔利用转换流按照指定的字符编码写入数据

写入数据

在这里插入图片描述

🍔读写结合,使用转换流读取数据并且写入数据,并且转换编码方式

读写结合

在这里插入图片描述

🛸乱码的解决方法

字节流读取中文会出现乱码,那么我们就要使用字符流
在这里插入图片描述

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

可以把Java中的对象写到本地文件中
在这里插入图片描述

🍔写出一个对象

🛸创建类Student.java

package IODemo2;import java.io.Serializable;public class Student implements Serializable {private String name;private int age;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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

注意
这里要加上Serializable接口
在这里插入图片描述

🛸创建类Demo1.java

package IODemo2;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;public class Demo1 {public static void main(String[] args) throws IOException {//创建对象Student stu=new Student("zhangsan",23);//创建序列化流的对象ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("G:\\a.txt"));//写出数据oos.writeObject(stu);//释放资源oos.close();}}

🎄反序列化流(对象操作输入流)

可以把序列化到本地文件中的对象,读取到程序中来
在这里插入图片描述

package IODemo2;import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;public class Demo2 {public static void main(String[] args) throws IOException, ClassNotFoundException {//创建反序列化流的对象ObjectInputStream ois=new ObjectInputStream(new FileInputStream("G:\\a.txt"));//读取数据Object o=ois.readObject();//打印对象System.out.println(o);//释放资源ois.close();}
}

读取成功
在这里插入图片描述

🌺小练习——读写多个对象

注意是多个对象

🛸创建类Student.java

package IODemo2;import java.io.Serializable;public class Student implements Serializable {private String name;private int age;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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

🛸创建类Write.Java

package IODemo2;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;public class Write {public static void main(String[] args) throws IOException {Student s1 = new Student("zhangsan", 23);Student s2 = new Student("lisi", 24);Student s3 = new Student("wangwu", 25);ArrayList<Student> list = new ArrayList<>();list.add(s1);list.add(s2);list.add(s3);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("G:\\a.txt"));oos.writeObject(list);}
}

🛸创建类Read.Java

package IODemo2;import java.io.*;
import java.util.ArrayList;public class Read {public static void main(String[] args) throws IOException, ClassNotFoundException {ObjectInputStream ois=new ObjectInputStream(new FileInputStream("G:\\a.txt"));ArrayList<Student>list=(ArrayList<Student>) ois.readObject();//强转for (Student student:list){System.out.println(student);}ois.close();}
}
🎈结果

一定要先写再读
先执行Write.java
再执行Read.java

在这里插入图片描述

如果大家对于这篇文章有问题,欢迎在评论区进行讨论

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

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

相关文章

简单的考试系统

开发一个简单的考试系统&#xff0c;在HTML页面中建立一个表单&#xff0c;通过post方法传递参数。题目类型包括单选题、多选题和填空题&#xff0c;要求程序给出考试成绩。 <!DOCTYPE html> <html> <head><title>question.html</title><met…

【LeetCode热题100】--108.将有序数组转换为二叉搜索树

108.将有序数组转换为二叉搜索树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 二叉搜索树的中序遍历是升序…

13链表-简单思路练习

目录 LeetCode之路——876. 链表的中间结点 分析&#xff1a; 解法一&#xff1a;常规思路 解法二&#xff1a;快慢指针 LeetCode之路——876. 链表的中间结点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回…

竞赛 机器视觉opencv答题卡识别系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 答题卡识别系统 - opencv python 图像识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分…

互联网Java工程师面试题·ZooKeeper 篇·第一弹

目录 1. ZooKeeper 面试题&#xff1f; 2. ZooKeeper 提供了什么&#xff1f; 3. Zookeeper 文件系统 4. ZAB 协议&#xff1f; 5. 四种类型的数据节点 Znode 6. Zookeeper Watcher 机制 -- 数据变更通知 7. 客户端注册 Watcher 实现 8. 服务端处理 Watcher 实现 9. 客…

ArcGIS Engine:实现Shp/Mxd数据的加载、图层的简单查询

本博客参考&#xff1a;BiliBili UP主 <羊羊旸> &#xff1a; Arcgis Engine学习 目录 01 加载控件以及控件的基本信息等调整 02 编写 <菜单-地图控件> 中各个子工具的代码 2.1 加载Shapefile数据-代码 2.2 加载地图文档数据-代码 2.3 获取图层数量-代码 2.…

vue3 +elementplus | vue2+elementui 动态地通过验证规则子新增或删除单个表单字段

效果图 点击 ‘’ 新增一行&#xff0c;点击‘-’ 删除一行 vue3elementplus写法 template <el-dialog v-model"dialogFormVisible" :title"title"><el-form ref"ruleFormRef" :model"form" :inline"true" lab…

【算法|动态规划No.8】leetcode面试题 17.16. 按摩师

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

对图像中边、线、点的检测(支持平面/鱼眼/球面相机)附源码

前言 图像的线段检测是计算机视觉和遥感技术中的一个基本问题,可广泛应用于三维重建和 SLAM 。虽然许多先进方法在线段检测方面表现出了良好的性能,但对未去畸变原始图像的线 段检测仍然是一个具有挑战性的问题。此外,对于畸变和无畸变的图像都缺乏统一的…

1.2.C++项目:仿muduo库实现并发服务器之时间轮的设计

文章目录 一、为什么要设计时间轮&#xff1f;&#xff08;一&#xff09;简单的秒级定时任务实现&#xff1a;&#xff08;二&#xff09;Linux提供给我们的定时器&#xff1a;1.原型2.例子 二、时间轮&#xff08;一&#xff09;思想&#xff08;一&#xff09;代码 一、为什…

云原生数据库TDSQL-C

数据库系统核心模块 云原生数据库要解决什么问题&#xff1f; HTAP 云数据库VS云原生数据库

mysql双主互从通过KeepAlived虚拟IP实现高可用

mysql双主互从通过KeepAlived虚拟IP实现高可用 在mysql 双主互从的基础上&#xff0c; 架构图&#xff1a; Keepalived有两个主要的功能&#xff1a; 提供虚拟IP&#xff0c;实现双机热备通过LVS&#xff0c;实现负载均衡 安装 # 安装 yum -y install keepalived # 卸载 …

Polygon Miden交易模型:Actor模式 + ZKP => 并行 + 隐私

1. 引言 前序博客&#xff1a; Polygon Miden&#xff1a;扩展以太坊功能集的ZK-optimized rollupPolygon Miden zkRollup中的UTXO账户混合状态模型 Polygon Miden为&#xff1a; ZK-optimized rollup由客户端生成证明完善Polygon ZK系列解决方案&#xff0c;致力于成为网络…

【C语言经典100例题-68】有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数

方法一 将原数组拆成两部分&#xff0c;前面n-m个数和后面m个数。首先将前面n-m个数逆序&#xff0c;然后将后面的m个数逆序。最后将整个数组逆序即可。 #include <stdio.h>void reverse(int arr[], int start, int end) {for (int i start, j end; i < (start en…

学过的汇编指令整合

1.数据搬移指令 <opcode>{<cond>}{s} <Rd>, <shifter_operand> 解释&#xff1a; <opcode>&#xff1a;指令码 {<cond>}&#xff1a;条件码 {s}&#xff1a;状态位&#xff0c;如果在指令后面加上s&#xff0c;则运算的结果会影响CPSR的条…

傅里叶系列 P2 的定价选项

系列上文&#xff1a;傅里叶系列 P1 的定价选项_无水先生的博客 一、说明 通过本文&#xff0c;您可以了解&#xff1a; 如何从知道什么是傅里叶级数到能够在黑色下为期权定价。 如果您想了解更多关于傅里叶级数基础知识的信息&#xff0c;请查看第 1 部分。随附笔记本&#…

objective-c 基础学习

目录 第一节&#xff1a;OC 介绍 ​​第二节&#xff1a;Fundation 框架 ​第三节&#xff1a;NSLog 相对于print 的增强 ​第四节&#xff1a;NSString ​第五节&#xff1a;oc新增数据类型 第六节&#xff1a; 类和对象 ​类的方法的声明与实现 ​第七节&#xff1a;类…

智慧公厕整体解决方案,厕所革命实施方案的范本

随着城市化进程的不断加快&#xff0c;智慧城市应用正成为未来城市发展的重要方向。其中&#xff0c;智慧公厕作为城市基础设施的重要组成部分&#xff0c;其建设范本已经成为各建设中的智慧城市不可或缺的重要内容。那么&#xff0c;如何打造智慧公厕整体解决方案&#xff1f;…

将数组和减半的最少操作【贪心2】

题目&#xff1a;将数组和减半的最少操作 贪心思路&#xff1a;每次挑选最大的数来减半。 解法&#xff1a;贪心大根堆 class Solution { public:int halveArray(vector<int>& nums) {priority_queue<double> heap;double sum 0.0;for(int& x : nums){hea…

(四)激光线扫描-光平面标定

在上一章节,已经实现了对激光线条的中心线提取,并且在最开始已经实现了对相机的标定,那么相机标定的作用是什么呢? 就是将图像二维点和空间三维点之间进行互相转换。 1. 什么是光平面 激光发射器投射出一条线,形成的一个扇形区域平面就是光平面,也叫光刀面,与物体相交…