文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-10-11 12:23

关注

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

文章目录


在这里插入图片描述

🎄缓冲流

在这里插入图片描述

在代码中使用缓冲流(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

在这里插入图片描述

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

来源地址:https://blog.csdn.net/m0_72853403/article/details/133523072

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯