当前位置: 首页 > article >正文

【JAVA入门】Day41 - 字节缓冲流和字符缓冲流

【JAVA入门】Day41 - 字节缓冲流和字符缓冲流


文章目录

  • 【JAVA入门】Day41 - 字节缓冲流和字符缓冲流
    • 一、缓冲流的体系结构
    • 二、字节缓冲流
      • 2.1 字节缓冲流提高效率的底层原理
    • 三、字符缓冲流


        在IO流体系中,FileInputStream,FileOutputStream,FileReader,FileWriter 其实都只是基本流,Java 中还有一些针对他们做出优化的高级流。
在这里插入图片描述

一、缓冲流的体系结构

在这里插入图片描述

        针对字节和字符,Java 分别发明了它们各自的缓冲流。缓冲流一共有四种,Buffered 代表缓冲区,它可以使得读写数据时非常高效

二、字节缓冲流

        字节缓冲流底层自带了一次可以读写 8192 长度的缓冲区。它的构造方法是将基本流通过一个方法进行包装,加入缓冲区。
在这里插入图片描述
        以下演示了如何利用字节缓冲流来拷贝一个文件:

package BufferedStream;

import java.io.*;

public class BufferedStreamDemo1 {
    public static void main(String[] args) throws IOException {
        /*
            字节缓冲流拷贝文件(一次读写一个字节)
         */

        //1.创建缓冲流对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\IdeaProjects\\HelloWord\\src\\BufferedStream\\a.txt"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\IdeaProjects\\HelloWord\\src\\BufferedStream\\a_Copied.txt"));

        //2.循环读取并写入目的地
        int b;
        while((b = bis.read()) != -1){
            bos.write(b);
        }

        //3.释放资源
        bos.close();
        bis.close();
    }
}

package BufferedStream;

import java.io.*;

public class BufferedStreamDemo2 {
    public static void main(String[] args) throws IOException {
        /*
            字节缓冲流拷贝文件(一次读写一个字节数组)
         */

        //1.创建缓冲流对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\IdeaProjects\\HelloWord\\src\\BufferedStream\\a.txt"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\IdeaProjects\\HelloWord\\src\\BufferedStream\\a_Copied.txt"));

        //2.字节数组
        byte[] bytes = new byte[1024 * 1024 * 5];
        int len;
        while((len = bis.read(bytes)) != -1){
            bos.write(bytes,0,len);
        }

        //3.关闭流
        bos.close();
        bis.close();
    }
}

2.1 字节缓冲流提高效率的底层原理

        字节缓冲流读写数据的内存结构如下图所示:
在这里插入图片描述
        可以看到,读写数据时,字节数据是在内存中的缓冲区进行倒手的,而内存的读写数据是非常非常快的,它的读写速度快到这个倒手的过程可以忽略不计,大大节省了数据与硬盘之间的交互时间。

三、字符缓冲流

        字符流本身就具有缓冲区,速度已经很快,而字符缓冲流进一步加快了读写速度。
在这里插入图片描述
        其构造方法如下:
在这里插入图片描述
        特别的是,字符缓冲流中还有两个非常有用的特有方法:
在这里插入图片描述
        readLine() 方法让我们可以一行一行读取数据,newLine() 方法是一个跨平台的换行方法,使用它可以保证在 Windows、Linux、Mac 所有操作系统下的换行都能生效且不会出错。
① 字符缓冲输入流的用法:

package BufferedStream;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedStreamDemo3 {
    public static void main(String[] args) throws IOException {
        /*
            字符缓冲输入流
         */

        //1.创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("D:\\IdeaProjects\\HelloWord\\src\\BufferedStream\\a.txt"));

        //2.一行一行读
        String line;
        while((line = br.readLine()) != null) {
            System.out.println(line);
        }


        //3.释放资源
        br.close();
    }
}

② 字符缓冲输出流的用法:

package BufferedStream;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedStreamDemo5 {
    public static void main(String[] args) throws IOException {
        /*
            字符缓冲输出流
         */

        //1.创建
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\IdeaProjects\\HelloWord\\src\\BufferedStream\\b.txt"));


        //2.写出数据
        bw.write("你嘴角上扬的样子,百度搜索不到");
        bw.newLine();       								//跨平台换行
        bw.write("以后如果我结婚了,你一定要来哦,没有新娘我会很尴尬");
        bw.newLine();

        //3.释放资源
        bw.close();
    }
}

http://www.kler.cn/news/302523.html

相关文章:

  • C++操作符重载实例(独立函数)
  • 《网络故障处理案例:公司网络突然中断》
  • 详说 类和对象
  • element form rules 验证数组对象属性时如何写判断规则
  • 测试驱动开发(TDD)学习分享-下篇
  • Python知识点:如何使用Python进行图像批处理
  • MySQL中的约束
  • 系统分析师10:知识产权与标准化
  • 大模型中的多模态概念指的是什么
  • (计算机网络)应用层
  • Tomcat_使用IDEA开发javaWeb工程并部署运用
  • 爱普生相机SD卡格式化后数据恢复指南
  • C++速通LeetCode第5题-回文链表
  • 防止文件外发泄密有什么方法?这7防外发方式可以看下!
  • 数字化转型背景下低代码开发模式变革的研究
  • Excel图表生成:自动化创建与修改Excel图表的技术指南
  • 基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)
  • pytorch torch.triu函数介绍
  • python实现进化算法
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【4.4】RK3588网络摄像头推理后推流到RTSP更多内容见视频
  • 海思SD3403(21AP10, 108DC2910 )4K60 的 ISP 图像处理能力,4Tops INT8算力
  • 数据结构2 :双向链表和内核链表
  • mysql可重复读不能解决幻读吗?
  • linux————根据端口查找运行目录的三种方法
  • STM32内部闪存FLASH(内部ROM)、IAP
  • 信息安全工程师题
  • ASR(自动语音识别)识别文本效果的打分总结
  • 用Cri-O,Sealos CLI,Kubeadm方式部署K8s高可用集群
  • 【docker】了解什么是Docker
  • 欧洲麻花钻市场主要企业市场占有率及排名