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

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

在这里插入图片描述

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下小吉.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值