文章目录

  • IO流之缓冲流
    • 1. 缓冲流概述
    • 2. 字节缓冲流
      • `BufferedInputStream/BufferedOutputStream`
      • 效率测试
    • 3. 字符缓冲流
      • 特有方法
    • 4. 练习--文本排序
      • 请将文本信息恢复顺序
      • 案例分析
      • 案例实现

IO流之缓冲流

缓冲流是一个更强大的流,能够高效读写。另外也有能够转换编码的转换流,能够持久化存储对象的序列化流等等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,相当于是对基本流对象的一种增强。

​ 缓冲流与普通流对比,缓冲流一次默认读写8192个字节,普通流通过数组来读取的时候通过设置适当的数字字节长度可以达到比缓冲流还要高效,但是缓冲流也可以改变缓冲区的默认值和,每次搬运的字节数,缓冲流更灵活。

1. 缓冲流概述

缓冲流是对FileOutputStream/FileInputStream/FileWriter/FileReader流的增强,所以也是4个流,按照数据类型分类:

  1. 字节缓冲流BufferedInputStream/BufferedOutputStream
  2. 字符缓冲流BufferedReader/BufferedWriter

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,等凑够了缓冲区大小的时候一次性写入磁盘,减少系统IO次数,从而提高读写的效率。
学习基础流的时候我们就已经知道flush()和close()这两个方法,这里再点一下:

  1. flush()是从缓冲区把文件写出。
  2. close()是将文件从缓冲区内写出并且关闭相应的流。

2. 字节缓冲流

BufferedInputStream/BufferedOutputStream

构造方法

  • public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
  • public BufferedOutputStream(OutputStream out): 创建一个新的缓冲输出流。
// 创建字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt"));
// 创建字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));
效率测试

查询API,缓冲流读写方法与基本的流是一致的,我们通过复制大文件,测试它的效率。

使用基本流,代码如下:

public class BufferedDemo {public static void main(String[] args) throws FileNotFoundException {// 记录开始时间long start = System.currentTimeMillis();// 创建流对象try (FileInputStream fis = new FileInputStream("jdk9.exe");FileOutputStream fos = new FileOutputStream("copy.exe")){// 读写数据int b;while ((b = fis.read()) != ‐1) {fos.write(b);}} catch (IOException e) {e.printStackTrace();}// 记录结束时间long end = System.currentTimeMillis();System.out.println("普通流复制时间:"+(end ‐ start)+" 毫秒");}
}

十几分钟过去了…

使用缓冲流,代码如下:

public class BufferedDemo {public static void main(String[] args) throws FileNotFoundException {// 记录开始时间long start = System.currentTimeMillis();// 创建流对象try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk9.exe"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.exe"));){// 读写数据int b;while ((b = bis.read()) != ‐1) {bos.write(b);}} catch (IOException e) {e.printStackTrace();}// 记录结束时间long end = System.currentTimeMillis();System.out.println("缓冲流复制时间:"+(end ‐ start)+" 毫秒");}
}

缓冲流复制时间:8016 毫秒

如何更快呢?

使用数组的方式,代码如下:

public class BufferedDemo {public static void main(String[] args) throws FileNotFoundException {// 记录开始时间long start = System.currentTimeMillis();// 创建流对象try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk9.exe"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.exe"));){// 读写数据int len;byte[] bytes = new byte[8*1024];while ((len = bis.read(bytes)) != ‐1) {bos.write(bytes, 0 , len);}} catch (IOException e) {e.printStackTrace();}// 记录结束时间long end = System.currentTimeMillis();// 缓冲流使用数组复制时间:666 毫秒System.out.println("缓冲流使用数组复制时间:"+(end ‐ start)+" 毫秒");}
}

3. 字符缓冲流

构造方法

public BufferedReader(Reader in):创建一个 新的缓冲输入流。

public BufferedWriter(Writer out): 创建一个新的缓冲输出流。

// 创建字节缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("br.txt"));
// 创建字节缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
特有方法

字符缓冲流的基本方法与普通字符流调用方式一致,不再阐述,我们来看它们具备的特有方法。

BufferedReader: public String readLine(): 读一行文字。

public class BufferedReaderDemo {public static void main(String[] args) throws IOException {// 创建流对象BufferedReader br = new BufferedReader(new FileReader("in.txt"));// 定义字符串,保存读取的一行文字String line = null;// 循环读取,读取到最后返回nullwhile ((line = br.readLine())!=null) {System.out.print(line);System.out.println("‐‐‐‐‐‐");}// 释放资源br.close();}
}

BufferedWriter: public void newLine(): 写一行行分隔符,由系统属性定义符号。

public class BufferedWriterDemo throws IOException {public static void main(String[] args) throws IOException {// 创建流对象BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));// 写出数据bw.write("简维");// 写出换行bw.newLine();bw.write("程序");bw.newLine();bw.write("员");bw.newLine();// 释放资源bw.close();}
}
输出效果:
简维
程序
员

4. 练习–文本排序

请将文本信息恢复顺序

3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必得裨补阙漏,有所广益。

8.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。

4.将军向宠,性行淑均,晓畅军事,试用之于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。

2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。

1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。

9.今当远离,临表涕零,不知所言。

6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。

7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐付托不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。

5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。

案例分析
  1. 逐行读取文本信息。

  2. 解析文本信息到集合中。

  3. 遍历集合,按顺序,写出文本信息。

案例实现
public class BufferedTest {public static void main(String[] args) throws IOException {// 创建map集合,保存文本数据,键为序号,值为文字HashMap<String, String> lineMap = new HashMap<>();// 创建流对象BufferedReader br = new BufferedReader(new FileReader("in.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));// 读取数据String line = null;while ((line = br.readLine())!=null) {// 解析文本String[] split = line.split("\\.");// 保存到集合lineMap.put(split[0],split[1]);}// 释放资源br.close();// 遍历map集合for (int i = 1; i <= lineMap.size(); i++) {String key = String.valueOf(i);// 获取map中文本String value = lineMap.get(key);// 写出拼接文本bw.write(key+"."+value);// 写出换行bw.newLine();}// 释放资源bw.close();}
}

5. IO流之缓冲流相关推荐

  1. 让你的数据和对象有源有出路,一文打尽,Java常用IO流处理流(处理字节流文件流)缓冲流、转换流、对象流等

    文章目录 缓冲流 转换流 标准输入输出流 打印流 数据流 对象流 随机存取文件流 Java NIO 缓冲流 为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个 ...

  2. 菜鸟学习笔记:Java提升篇5(IO流1——IO流的概念、字节流、字符流、缓冲流、转换流)

    菜鸟学习笔记:Java IO流1--IO流的概念.字节流.字符流.缓冲流.转换流 IO流的原理及概念 节点流 字节流 文件读取 文件写出 文件拷贝 文件夹拷贝 字符流 文件读取 文件写出 处理流 缓冲 ...

  3. 第十五章 IO流(转换流 字符流 字符缓冲流 打印流)

    Java基础15 第十五章 IO流(转换流 字符流 字符缓冲流 打印流) 15.1 字符编码和字符集 15.1.1 字符编码 15.1.2 字符集 15.1.3 String类getBytes()方法 ...

  4. 【Java基础】吃透Java IO:字节流、字符流、缓冲流

    文章目录 [Java基础-3]吃透Java IO:字节流.字符流.缓冲流 一.初识java IO 1.1 IO流分类 1.1.1 输入流与输出流 1.1.2 字节流与字符流 1.1.3 节点流和处理流 ...

  5. java IO流之缓冲流详解

    缓冲流概述 缓冲流也称为高效流或者高级流.之前我们学习的字节流.字符流可以成为基本流. 作用:缓冲流自带缓冲区.可以提高基本字节流.字符流读写数据的性能. 分类: BufferedInputStrea ...

  6. IO Streams:缓冲流

    我们迄今为止看到的大多数示例都使用无缓冲的I / O.这意味着每个读或写请求都由底层操作系统直接处理.这使程序效率变得很低,因为每个这样的请求经常触发磁盘访问,网络活动或一些相对昂贵的其他操作. 为了 ...

  7. java中的包装流和缓冲流概述

    处理流/包装流(相对于节点流更高级)装饰设计模式/包装模式: 1:隐藏了底层的节点流的差异,并对外提供了更方便的输入/输出功能,让我们只关心高级流的操作. 2:使用处理流包装了节点流,程序直接操作处理 ...

  8. Java_IOl流_缓冲流_转换流

    1.缓冲流 使用缓冲流实现a.jpg文件复制为b.jpg文件的操作 public class Exer01 {public static void main(String[] args) {//文件路 ...

  9. JAVA I/O流 字符流和字节流、节点流和处理流(包装流、过滤流)、缓冲流

    JAVA IO流 一.相关概念 1.分类: 区别和联系 代码 嵌套的IO流关闭的问题 一.相关概念 I/O流: Input/Output Stream,文件输入输出流. 1.分类: 输入流 和 输出流 ...

最新文章

  1. ML Pipelines管道
  2. angularJS新增 品优购新增品牌
  3. vmware vsphere 虚拟化之安装esxi
  4. c#怎么读htm文件_c#怎么读写文件和获取文件的扩展名
  5. 学习Java的十大理由,益处太多了
  6. mongodb 监控命令mongostat
  7. HTML页面背景音乐控制
  8. Mac OS使用技巧之八:Dock栏使用技巧
  9. 【PyTorch】torch.cat==>张量拼接,在图像的应用上可以有效利用原始图像结构信息
  10. 虚拟服务器配置推荐,如何选择虚拟主机配置
  11. 数据通信与计算机网络第2版,数据通信与计算机网络(第2版)习题1
  12. contenttype类型_HTTP请求中,几种常见的ContentType类型解析
  13. BGP选择路由的策略
  14. 电子工程师私藏的一个网站
  15. 2004年考研数学一真题解析pdf
  16. 调用百度地图API实现连线高铁线路的调用示例
  17. 手机屏幕物理点击器是什么原理_手机触摸屏的原理是什么?
  18. 微信小程序之文本换行居中
  19. SpringBoot集成移动云MAS平台(SDK版本)
  20. iis让支持webp文件

热门文章

  1. Spring4 实战笔记(3):面向切面编程
  2. 图像检测:图像预处理
  3. BlackBerry 代码签名工具申请及安装介绍
  4. IoT 物联网设备端 SDK 架构设计参考
  5. Eclipse在导入项目时显示 “Invalid Project Description”时的处理方法
  6. 成功之路散文连载之伪君子岳不群
  7. 对于安装破解版BurpSuite无法用java打开注册机的问题
  8. 最老程序员创业开发实训12---Android---在MVC架构下Activity设计及实现
  9. 计算机监控系统功能概述,物联网技术在计算机监控系统的应用
  10. 教你如何建立STM32F103通用工程模板(固件库)