【JavaEE基础与高级 第53章】Java中的IO流中的缓冲流详细介绍使用、字节缓冲流、字符缓冲流、案例使用与总结
创始人
2024-04-03 01:36:50
0

文章目录

  • 💨更多相关知识👇
    • 一、缓冲流
      • 1、缓冲流介绍
      • 2、缓冲流继承关系图
      • 3、字节缓冲流 (操作所有文件)
        • (1)字节输出缓冲流 BufferedOutputStream
          • ⭐代码演示
        • (2)字节输入缓冲流 BufferedInputStream
          • ⭐代码演示
      • 4、字符缓冲流(操作纯文本文件)
        • (1)字符输出缓冲流 BufferedWriter
          • ⭐代码演示
        • (2)字符输入缓冲流 BufferedReader
          • ⭐代码演示
      • 5、综合案例字符流解析文件
      • 6、缓冲流性能对比案例
        • 案例结论
      • 7、缓冲流总结
  • 作者:KJ.JK

💨更多相关知识👇

💖Spring中的创建对象的三种方式、第三方资源配置管理详细描述及使用(XML版完结篇)

💖Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)

💖Spring中的依赖注入、setter与构造器注入、自动装配与集合注入详细描述及使用(XML版中篇)


🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
 
🍂个人博客首页: KJ.JK
 
💖系列专栏:JavaEE进阶教程系列


一、缓冲流


1、缓冲流介绍

 * 缓冲流是对4个基本的 FileXxx 流的增强,所以也是4个流* 按照数据类型分类:字节缓冲流:  BufferedInputStream , BufferedOutputStream字符缓冲流:  BufferedReader , BufferedWriter/*缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率
*/

2、缓冲流继承关系图

请添加图片描述


3、字节缓冲流 (操作所有文件)


(1)字节输出缓冲流 BufferedOutputStream

     * "BufferedOutputStream" 继承 "OutputStream",操作时还是"使用OutputStream的write方法"*  构造方法:    "BufferedOutputStream(OutputStream out)" 参数要一个"基本的流",最终靠"基本的流去操作文件"  //需要 FileOutputStream 这个基本字节输出流               

请添加图片描述


⭐代码演示
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class BufferOutputStream_Test {public static void main(String[] args) throws IOException {//创建字节缓冲流//方式1
//    BufferedOutputStream  bos=new BufferedOutputStream(new FileOutputStream("s_day11\\abcday11\\1.txt"));//方式2FileOutputStream f=new FileOutputStream("s_day11\\abcday11\\1.txt");BufferedOutputStream  bos=new BufferedOutputStream(f);//写单个字节bos.write(97);//写一个字节数组byte [] bys={'a','b','c'};bos.write(bys);//写一个字节数组,从指定地方开始写到指定地方结束bos.write(bys,0,1);bos.write("中国".getBytes());//缓冲流底层是缓冲区需要刷新或者关闭bos.close();}
}

请添加图片描述


(2)字节输入缓冲流 BufferedInputStream

   * "BufferedInputStream" 继承"InputStream",操作还是使用"InputStream的read方法"* 构造方法:"BufferedInputStream(InputStream in)" 参数"要一个基本的流",靠"基本的流去操作文件"//需要  new FileInputStream 这个基本字节输入流         

⭐代码演示
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class BufferedInputStream_Test {public static void main(String[] args) throws IOException {//创建字节缓冲流//方式1
//        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("s_day11\\abcday11\\1.txt"));//方式2FileInputStream  f=new FileInputStream("s_day11\\abcday11\\1.txt");BufferedInputStream bis=new BufferedInputStream(f);//读数据byte [] bys=new byte[1024];int len = bis.read(bys);//转成字符串输出System.out.println(new String(bys,0,len));bis.close();}
}

请添加图片描述


4、字符缓冲流(操作纯文本文件)


(1)字符输出缓冲流 BufferedWriter

       * "BufferedWriter" 继承了"Writer",可以使用父类"Writer中的write方法"* 构造方法:"BufferedWriter(Writer out)" 参数"要传入基本流",靠"基本流来操作文件"* 特有方法:"newline() 换行"      (相当于\r\n   //通用性强,可以跨系统使用)// 需要 new FileWriter 基本字符输出流

⭐代码演示
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public  class BufferedWriter_Test {public static void main(String[] args) throws IOException {BufferedWriter bw=new BufferedWriter(new FileWriter("F:\\ideaJavaCode10after\\s_day11\\abcday11\\2.txt"));bw.write("it中国");//特有方法bw.newLine();      //newLine换行 相当于\r\n   //通用性强,可以跨系统使用bw.write("中国it");bw.close();}
}

请添加图片描述


(2)字符输入缓冲流 BufferedReader

       * "BufferedReader" 继承了"Reader",可以使用父类 "Reader中的read方法"* 构造方法:"BufferedReader(Reader in)" 参数"要传入基本流",靠"基本流来操作文件"* 特有方法:String readLine() : "一次读一行","读取不到数据返回null"// 需要  new FileReader 基本字符输入流	           

⭐代码演示
import java.io.*;public class BufferedReader_Test {public static void main(String[] args) throws IOException {BufferedReader  br=new BufferedReader(new FileReader("F:\\ideaJavaCode10after\\s_day11\\abcday11\\2.txt"));String line;while ((line=br.readLine())!=null){System.out.println(line);}br.close();}
}

请添加图片描述


5、综合案例字符流解析文件

请添加图片描述


import java.util.Objects;public class User {public User(String line) {}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;}public User(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return age == user.age && Objects.equals(name, user.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}private  String  name;private  int age;@Overridepublic String toString() {return name+","+age;}
}-----------------------------------------------------------------------------import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class Test {public static void main(String[] args) throws IOException {BufferedReader br=new BufferedReader(new FileReader("F:\\ideaJavaCode10after\\s_day11\\用户列表.txt"));ArrayList list=new ArrayList<>();String line;while ((line=br.readLine())!=null){
//            System.out.println(line);String[] split = line.split("=");//因为每次都是都是奇数是名字,偶数是年龄,每次都是切一行就换行//所以每次都是从0,1开始String name=split[0];int age=Integer.parseInt(split[1]);User u=new User(name,age);list.add(u);}list.sort((o1, o2) -> o1.getAge()-o2.getAge());br.close();System.out.println(list);}
}

请添加图片描述


6、缓冲流性能对比案例

请添加图片描述


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class Demo {/*四种方式复制:基本流读取一个字节 37764缓冲流读取一个字节  83基本流一次读一个数组  137缓冲流一次读一个数组  114*/public static void main(String[] args) throws Exception {long start=System.currentTimeMillis();//        test1();     37764//          test2();   83//        test3();     137//        test4();   114long end=System.currentTimeMillis();System.out.println(end-start);}public  static  void test1() throws  Exception{    //基本流读取一个字节 37764FileInputStream fis=new FileInputStream("F:\\ideaJavaCode10after\\s_day11\\演示.ppt");FileOutputStream fos=new FileOutputStream("F:\\ideaJavaCode10after\\s_day11\\test1copy.ppt");int b;while ((b=fis.read())!=-1){fos.write(b);}fos.close();fis.close();}public  static  void test2() throws  Exception{    //缓冲流读取一个字节  83BufferedInputStream  bis= new BufferedInputStream(new FileInputStream("F:\\ideaJavaCode10after\\s_day11\\演示.ppt"));BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("F:\\ideaJavaCode10after\\s_day11\\test2copy.ppt"));int b;while ((b=bis.read())!=-1){bos.write(b);}//只需要关闭缓冲流,缓冲流底层会自动关闭基本流bis.close();bos.close();}public  static  void test3() throws  Exception{    //基本流一次读一个数组  137FileInputStream fis=new FileInputStream("F:\\ideaJavaCode10after\\s_day11\\演示.ppt");FileOutputStream fos=new FileOutputStream("F:\\ideaJavaCode10after\\s_day11\\test3copy.ppt");byte [] bys=new byte[1024];int len;while ((len=fis.read(bys))!=-1){fos.write(bys,0,len);}fos.close();fis.close();}public  static  void test4() throws  Exception{      //缓冲流一次读一个数组  114BufferedInputStream  bis=new BufferedInputStream(new FileInputStream("F:\\ideaJavaCode10after\\s_day11\\演示.ppt"));BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("F:\\ideaJavaCode10after\\s_day11\\test4copy.ppt"));byte [] bys=new byte[1024];int len;while ((len=bis.read(bys))!=-1){bos.write(bys,0,len);}bos.close();bis.close();}
}

案例结论

               1.在读写的时候,要使用一次读取一个字节数组的方式去读取2.缓冲流读写效率都是比较高的,通常使用缓冲流去读写数据,以提高效率3.缓冲流底层使用了缓冲数组,默认是8*1024大小,是先把数据全部放进去,装满了再一次性放进去,所以效率高

7、缓冲流总结

    * 字符缓冲流为什么提高了操作数据的性能?* 字符缓冲流"自带8K缓冲区"   (8*1024)* 可以提高原始字符流读写数据的性能* 说出字符缓冲流的新增功能* public BufferedReader(Reader r)"多了readLine()按照行读取的功能"* public BufferedWriter(Writer w)"多了newLine()换行的功能"

请添加图片描述


作者:KJ.JK

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...