IO流(七):缓冲流---BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter。

目录

1、什么是缓冲流?

2、代码演示

2.1 字节缓冲输入流(BufferedInputStream)和输出流(BufferedOutputStream)

2.2  字符缓冲输入流(BufferedReader)

2.3 字符缓冲输出流(BufferedWriter)

 3、源码分析

3、总结


上两篇文章我们学习到了字节流-输入流(Inpustream)、输出流(OutputStream)

字符流-输入流(FileReader)、输出流(FileWriter)。这些都是非常基础的原始流。

下面我们来学习一下包装流之---缓冲流Buffered

1、什么是缓冲流?

对原始流进行包装,以提高原始流读写数据的性能。
在内存中给定一个缓冲区。先开辟一块缓冲区的大小(默认8k,可以自己更改)

我们写出数据的时候,先把数据写到缓冲区(由于缓冲区在内存中,程序操作内存是非常快的),缓冲区装满数据之后,再把缓冲区的数据写出到目标文件(目标文件在硬件中,程序操作硬件是非常消耗资源的),这样可以减少程序和硬件资源的交互次数,提高程序效率。

2、代码演示

2.1 字节缓冲输入流(BufferedInputStream)和输出流(BufferedOutputStream)

必须要先定义原始流和文档做连接,缓冲流只是在原始流的基础上包装缓冲区从而提高性能。

用法和原始流也是非常类似。

public class BufferInpuStreamTest1 {

    public static void main(String[] args) {
        try (
                InputStream fileInputStream = new FileInputStream("src/main/resources/aaa.txt"); //先定义一个原始字节输入流
                BufferedInputStream inBuffer = new BufferedInputStream(fileInputStream);//再定义一个包装流来包装原始输入流

                OutputStream outputStream = new FileOutputStream("src/main/resources/bbb.txt");//先定义一个原始字节输出流
                BufferedOutputStream outBuffer = new BufferedOutputStream(outputStream);//再定义一个包装流来包装原始输出流
        ) {
            byte[] buffer = new byte[1024];  //定义一个水桶,表示一次往包装流中装多少字节
            int len;
            while ((len = inBuffer.read(buffer)) != -1){
                outBuffer.write(buffer,0,len);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

我们可以看到,这段程序把aaa.txt文件内容拷贝到了bbb.txt


 

字节流适用于文件复制类的业务(图片、视频、文本皆可操作),字符流适合操作纯文本类的文件

2.2  字符缓冲输入流(BufferedReader)

相比较于原始字符输入流,新增了一个按行读取的方法.readLine();

在以后的开发中,用字符缓冲流一行一行读取代码,是非常普遍应用的

public class BufferReaderTest1 {

    public static void main(String[] args) {
        try (
                Reader fileReader = new FileReader("src/main/resources/aaa.txt"); //先定义一个原始字符输入流
                BufferedReader inBuffer = new BufferedReader(fileReader);//再定义一个包装流来包装原始输入流
        ) {

            String line;
            while ((line = inBuffer.readLine()) != null){  //当读取不到数据的时候,会返回null,表示文件读取结束
                System.out.println(line);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

我们可以看到,这段程序把aaa.txt文件按行读取并打印到了控制台上

2.3 字符缓冲输出流(BufferedWriter)

相比较于原始字符输出流,新增了一个换行的方法.newLine();

字符缓冲输出流其实内置也有一个缓冲区,但是不是特别大。

public class BufferReaderTest1 {
    public static void main(String[] args) {
        try (
                Writer fileWriter = new FileWriter("src/main/resources/bbb.txt"); //先定义一个原始字符输入流
                BufferedWriter inBuffer = new BufferedWriter(fileWriter);//再定义一个包装流来包装原始输入流
        ) {
            inBuffer.write('a');
            inBuffer.write('你');
            inBuffer.write(97);
            inBuffer.newLine(); //换行
            inBuffer.write("我爱中国!!!");

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

我们可以看到,我们向文本中写入了字符。

 3、源码分析

我们以BufferedInputStream为例,看到源码里面定义了一个缓冲内存区, 大小为8kb

8192字节= 8kb

扩展:
1byte(一个字节) = 8bit(八位,也叫八个比特位,由0或1表示一个位,表示信息量的最小单位) 

1kb = 1024byte

在计算机中,字节(byte)是最小的存储单位,常用于衡量硬盘容量、文件大小等。‌

我们可以自己修改这个缓冲区的大小,只需要在创建BufferedInputStream时加一个参数给定缓冲区大小即可。

3、总结

缓冲流把原始流包装了一下,以提高传输数据的性能。

必须要先定义原始流和文档做连接,缓冲流在原始流的基础上包装一个缓冲区,大小默认8kb,我们可以自行修改。

缓冲流用法和原始流也是非常类似的。

相比较于原始流,字符缓冲输入流(BufferedReader)新增了一个按行读取的方法.readLine();字符缓冲输出流(BufferedWriter)新增了一个换行的方法.newLine(),在日常开发中非常实用。

注意:缓冲区大小不是越大越好,因为缓冲区也是在内存中开辟的,开辟太大会占用内存,性能反而会下降。下一篇做性能压测,给同学们讲解一下这个知识点。

这就是我对缓冲流的理解,希望能帮到大家,有问题的地方欢迎大家一起讨论!

后续会不断更新作品,欢迎大家一起讨论学习。❤❤❤

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值