1、缓冲流

体系结构如下所示:

image.png

2、字节缓冲流

image.png

import java.io.*;

public class Test1 {
    public static void main(String[] args) throws IOException {
        //创建对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("F:\\Java基础\\Test02\\aa\\name.txt"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:\\Java基础\\Test02\\aa\\copy.txt"));

        //进行复制
        int len = 0;
        while ((len = bis.read()) != -1){
            bos.write(len);
        }

        //关闭资源
        bos.close();
        bis.close();

    }
}

3、字符缓冲流

特有的方法 image.png

4、转换流(字节流和字符流之间的桥梁)

image.png

作用:当字节流想要使用字符流中的方法时,需要使用到转换流。

现有如下需求:

image.png

//问题1
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;

public class Question1 {
    public static void main(String[] args) throws IOException {
        //创建对象并指定编码
        FileReader fr = new FileReader("F:\\Java基础\\Test02\\aa\\GBK.txt", Charset.forName("GBK"));

        //读取数据
        int len = 0;
        while ((len = fr.read()) != -1){
            System.out.print((char) len);
        }

        //关闭资源
        fr.close();
    }
}
//问题2
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;

public class Question2 {
    public static void main(String[] args) throws IOException {
        //创建对象并关联文件
        FileWriter fw = new FileWriter("F:\\Java基础\\Test02\\aa\\GBK.txt", Charset.forName("GBK"));

        //写入数据
        fw.write("你好你好呀");

        //关闭资源
        fw.close();
    }
}
//问题3
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;

public class Question3 {
    public static void main(String[] args) throws IOException {
        //创建对象关联对象并指定字符集
        FileReader fr = new FileReader("F:\\Java基础\\Test02\\aa\\GBK.txt", Charset.forName("GBK"));
        FileWriter fw = new FileWriter("F:\\Java基础\\Test02\\aa\\utf-8.txt", Charset.forName("utf-8"));

        //边读边写
        int ch = 0;
        while ((ch = fr.read()) != -1) {
            fw.write(ch);
        }

        //关闭资源
        fw.close();
        fr.close();


    }
}

jdk11之前的方法: image.png

问题4:使用字节流(字节流是没有读取一行的方法的)读取文件中的数据,每次读取一行,而且不能出现乱码。

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Question4 {
    public static void main(String[] args) throws IOException {
        //InputStreamReader表示将字节流转换为字符流,然后再转换为高级缓冲流
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("F:\\Java基础\\Test02\\aa\\utf-8.txt")));

        //直接调用高级缓冲流中的方法
        String str = null;
        while ((str = br.readLine()) != null){
            System.out.println(str);
        }

        //关闭资源
        br.close();

    }
}

总结内容:

image.png

5、序列化流(可以把java中的对象写到本地文件中)
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Test1 {
    public static void main(String[] args) throws IOException {
        //创建学生的对象
        Student stu = new Student("张三", 21);

        //创建序列化流并且关联文件
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:\\Java基础\\Test02\\aa\\Student.txt"));

        //将数据写入到文件中,注意这个类需要实现Serializable接口
        oos.writeObject(stu);

        //关闭资源
        oos.close();

    }
}
6、反序列化流

image.png

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Test2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("F:\\Java基础\\Test02\\aa\\Student.txt"));
        //读取数据
        Object o = ois.readObject();
        //打印对象
        System.out.println(o);
        //关闭资源
        ois.close();

    }
}

使用序列化的一些细节:

①、需要给类添加序列号,不然如果修改了类,那么在反序列化的时候就会报错

②、如果不想给某个属性序列化到本地文件,那么就给这个属性添加transient关键词,如下所示:

private transient String address;

读多个对象:

首先在把对象写入文件的时候就要通过集合的方式写入,如下所示:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collections;

public class Test1 {
    public static void main(String[] args) throws IOException {
        //创建学生的对象
        Student stu1 = new Student("张三", 21);
        Student stu2 = new Student("李四", 22);
        Student stu3 = new Student("王五", 25);

        //将上面的学生对象放进一个集合中
        ArrayList<Student> list = new ArrayList<>();
        Collections.addAll(list, stu1, stu2, stu3);

        //创建序列化流并且关联文件
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:\\Java基础\\Test02\\aa\\Student1.txt"));

        //然后直接将集合写入文件中
        oos.writeObject(list);


        //关闭资源
        oos.close();

    }
}

然后读取的时候再按照集合的方式读取出来:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;

public class Test3 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //创建对象并关联文件
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("F:\\Java基础\\Test02\\aa\\Student1.txt"));

        //读取数据,直接读取集合,需要进行强制类型转换
        ArrayList<Student> list = (ArrayList<Student>) ois.readObject();

        //对集合进行遍历
        for (Student student : list) {
            System.out.println(student);
        }

        //关闭资源
        ois.close();
    }
}

7、字节打印流(只有写,没有读)

image.png

构造方法如下所示:

image-20230826162740778

常用方法如下所示: image.png

8、字符打印流

image.png

==成员方法和字节打印流一样!!!!==

9、压缩流和解压缩流

9.1、解压缩流

解压的本质:把每一个ZipEntry按照层级拷贝到本地另一个文件夹中