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

news2025/1/13 16:57:20

🎊专栏【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;
    }

    @Override
    public 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;
    }

    @Override
    public 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.coloradmin.cn/o/1058012.html

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

相关文章

vue ant 隐藏列

vue ant 隐藏列 重要代码 type: FormTypes.hidden{ title: 序号, key: barCode, width: 10%, type: FormTypes.hidden},

YTM32的电源管理与低功耗系统详解

YTM32的电源管理与低功耗系统详解 苏勇&#xff0c;2023年10月 文章目录 YTM32的电源管理与低功耗系统详解缘起原理与机制电源管理模型的功耗模式正常模式&#xff08;Normal&#xff09;休眠模式&#xff08;Sleep&#xff09;深度休眠模式&#xff08;DeepSleep&#xff09;…

树概念及结构

.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;称为根结点&a…

新手学习笔记-----编译和链接

目录 1. 翻译环境和运⾏环境 2. 翻译环境&#xff1a;预编译编译汇编链接 2.1 预处理 2.2 编译 2.2.1 词法分析 2.2.2 语法分析 2.2.3 语义分析 2.3 汇编 2.4 链接 3. 运⾏环境 1. 翻译环境和运⾏环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第…

【Leetcode】 131. 分割回文串

给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xff1a; 输入&#xff1a;s "aab" 输出&#xff1a;[["a","a"…

华为云云耀云服务器L实例评测|Huawei Cloud EulerOS 自动化环境部署

[toc] Huawei Cloud EulerOS 自动化环境部署 云耀云服务器L实例【Huawei Cloud EulerOS 2.0 64bit】 Python Git Google Chrome Chromedriver Selenium More… 1. Python 镜像创建后自带。 2.Git 拉取项目。 sudo yum install git3. Google Chrome 使用root权限或sudo权…

WinFroms基于三层构造设计模式的框架所设计的代码生成器1.0

软件开发模式——三层架构 此文章需要在读懂 以上这篇架构模式的基础上再继续往下深入学习简化 目录 1.前言 2.框架准备 3 .coboBox的数据绑定 4.创建文件夹 5.工具方法 6.生成一个数据库访问助手类SqlHelper 7.生成模型层Model 8.生成数据访问层DAL层 9.生成业务…

VD6283TX环境光传感器驱动开发(3)----测试闪烁频率代码

VD6283TX环境光传感器驱动开发----3.测试闪烁频率代码 概述视频教学样品申请源码下载参考代码开发板设置测试结果 概述 ST提供了6283A1_AnalogFlicker代码在X-NUCLEO-6283A1获取闪烁频率&#xff0c;同时移植到VD6283TX-SATEL。 闪烁频率提取主要用于检测光源的闪烁频率&#…

在pycharm中出现下载软件包失败的解决方法

一. 一般情况下我们会选择在设置中下载软件包,过程如下. 1. 直接点击左上角的文件, 再点击设置, 再点击项目, 在右边选择python解释器,点击号,输入要下载的软件包, 在下面的一系列的包中选择相对应的包,点击安装就可以了,有的时候我们下载的是最新的版本,如果要下载固定的版本…

数据结构与算法——19.红黑树

这篇文章我们来讲一下红黑树。 目录 1.概述 1.1红黑树的性质 2.红黑树的实现 3.总结 1.概述 首先&#xff0c;我们来大致了解一下什么是红黑树 红黑树是一种自平衡的二叉查找树&#xff0c;是一种高效的查找树。红黑树具有良好的效率&#xff0c;它可在 O(logN) 时间内完…

爬虫HTTP代理:获取多种类型数据的神器

爬虫HTTP代理是一种常用的数据采集工具&#xff0c;它可以帮助用户获取各种类型的数据。以下是爬虫HTTP代理能获取的一些常见数据&#xff1a; 网页数据 爬虫HTTP代理最常用的功能就是获取网页数据。通过代理服务器&#xff0c;用户可以获取到被封锁或限制访问的网站数据&…

pytorch之nn.Conv1d详解

自然语言处理中一个句子序列&#xff0c;一维的&#xff0c;所以使用Conv1d

Linux--socket编程

socket套接字编程 一、服务器和客户端的开发步骤&#xff1a; 1、创建套接字 2、为套接字添加信息&#xff08;ip地址和端口号&#xff09; 3、监听网络连接 4、监听到有客户端接入&#xff0c;接受连接&#xff08;如没有接入&#xff0c;会发生阻塞到&#xff09; 5、数据…

【题库】咸鱼之王答题挑战题库大全

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] [{name: , value: 未匹配到内容},# 第一期{name: 《三国演义》中&#xff0c;「大意失街亭」的是马谩&#xff1f;, value: 对},{name: 《三国演义》中&#xff0c;「挥泪斩马谩」的是孙权&#xff1f;, value: 错…

算法设计与分析第一周题目

Leetcode 4.寻找两个正序数组的中位数 题目描述&#xff1a; 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 解法1&#xff1a;先排序再查找 先…

上海建筑模板厂家:承载城市梦想的力量

上海&#xff0c;作为中国最具国际化和现代化的城市之一&#xff0c;拥有令人瞩目的建筑风貌和繁荣的建筑业。在这座充满活力的城市里&#xff0c;建筑模板作为建筑施工的重要组成部分&#xff0c;发挥着不可或缺的作用。而上海建筑模板厂家作为支撑城市发展的重要力量&#xf…

北大硕士7年嵌入式学习经验分享

阶段 1 大一到大三这个阶段我与大多数学生相同&#xff1a; 学习本专业知识&#xff08;EE专业&#xff09;&#xff0c;学习嵌入式软件开发需要的计算机课程&#xff08;汇编原理&#xff0c;计算机组成原理&#xff0c;操作系统&#xff0c;C语言等&#xff09;&#xff0c…

Git使用【中】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 目录 &#x1f449;&#x1f3fb;分支管理分支概念git branch&#xff08;查看/删除分…

MacOS怎么安装Nacos(附带:Windows系统)

MacOS安装Nacos&#xff08;一定要配置JDK的环境变量&#xff0c;后面告诉你为什么&#xff1f;&#xff09; &#xff08;1&#xff09;进入Nacos官网&#xff0c;前往githubhomehomehttp://nacos.io/zh-cn/ &#xff08;2&#xff09;点击右下角的releases 然后点击Tags 选择…

【算法】排序——选择排序和交换排序(快速排序)

主页点击直达&#xff1a;个人主页 我的小仓库&#xff1a;代码仓库 C语言偷着笑&#xff1a;C语言专栏 数据结构挨打小记&#xff1a;初阶数据结构专栏 Linux被操作记&#xff1a;Linux专栏 LeetCode刷题掉发记&#xff1a;LeetCode刷题 算法头疼记&#xff1a;算法专栏…