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

Java 中的缓冲流

字符流

前面学习的字节流和字符流都是基本流,其中字符流的底层其实已经在内存中创建了一个长度为8192的字节数组作为缓存区。而字节流中则是没有的。

在内存中增加缓冲区的目的是为了减少内存与硬盘的交互的次数,因为这一操作比较耗时。

下面是一个图示例:

缓冲区是什么时候创建的呢?

答案是在创建流的时候创建的。 

字符输入流读取数据 

当首次使用read方法从硬盘中读取文件时会先一次性地读取8192个字节到缓冲区中,后面再读取时会从缓冲区中读取。当缓冲区中的数据读完时会再次到文件中读,文件中的数据也读完时会返回-1。

字符输出流写入数据

当使用write方法向文件中写入数据时并不是直接就写到文件中,而是先写到缓冲区中,当缓冲区满时再一次性地写到文件中。或者不满时也想写到文件中时可以使用flush方法,当关闭输出流时也会将缓冲区中的数据写到文件中。

缓冲流

于是又设计出来一些高级流,比如字节缓冲流和字符缓冲流。

(1)缓冲流在使用时要传递基本流的对象过去,因为缓冲流只是对基本流包装了一下,并增加了缓冲区,但是干活的其实还是基本流。

(2)其实缓冲流就是在底层增加了一个长度为8192的数组作为缓冲区。

字节缓冲流的缓冲区是byte类型的,而字符缓冲流的缓冲区则是char类型的数组。

所以字节缓冲流的缓冲区大小是8192B=8*1024B=8KB,字符缓冲流的缓冲区的大小为8192*2B=16KB。

字节缓冲流

如何创建它们的对象呢?

2个构造方法,可以看到需要传递字节流的对象过去。

方法名说明
public BufferedInputStream(InputStream in)创建一个缓冲输入流
public BufferedOutputStream(OutputStream out)创建一个缓冲输出流

细节:

只用关闭字节缓存流,字节流的对象是不用管的,因为字节缓存流会帮我们关闭。

字符缓冲流

字符缓冲流由于字节流中本来就有缓存区,因此效率提升不大,但是有2个特有方法。

细节1:readLine()会读取换行符之前的数据并进行返回。

细节2:newLine()方法,当想写入换行符时,不同的系统中换行符是不一样的,比如Mac是\r,Linux中则是\n,Windows中则是\r\n。代码中直接写换行符其实是不合理的,比如同一个代码,放到不同的系统中效果是不一样的,这样不好,于是就要newLine()方法, 不同的系统中效果都是一样的。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Animate软件基础:关于补间动画中的图层
  • 关于香橙派系统烧录,1.1.8或者1.1.10两个版本都无法启动Orangepi5
  • 数据库相关概念大全!
  • 如何优雅地重装系统:使用Ventoy实现系统安装All In One
  • c# 构造器的声明与调用
  • 微信小程序开发:从小程序申请到小程序上线所需要了解的内容
  • 前端使用html2canvas在页面截图并导出,以及截图中含有图片时的跨域问题解决
  • 【前端 19】使用Vue-CLI脚手架构建Vue2项目
  • 学python的第二天:第一个代码
  • 使用WebSocket实现log日志流的实时展示-从轮询到通知
  • Spring面试资料大全
  • 基于cubeMX的STM32开启SPI及DMA
  • 【外排序】--- 文件归并排序的实现
  • 实验5-10 使用函数统计指定数字的个数
  • VGA接口驱动设计验证
  • ES6指北【2】—— 箭头函数
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • gulp 教程
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JS 面试题总结
  • leetcode讲解--894. All Possible Full Binary Trees
  • October CMS - 快速入门 9 Images And Galleries
  • Vue组件定义
  • 如何在GitHub上创建个人博客
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 项目实战-Api的解决方案
  • 小而合理的前端理论:rscss和rsjs
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • ​数据结构之初始二叉树(3)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (10)ATF MMU转换表
  • (bean配置类的注解开发)学习Spring的第十三天
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (南京观海微电子)——I3C协议介绍
  • (十六)Flask之蓝图
  • (算法)求1到1亿间的质数或素数
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转) ns2/nam与nam实现相关的文件
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET框架
  • .NET中GET与SET的用法
  • @Async注解的坑,小心
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [android] 请求码和结果码的作用
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [C#]winform部署yolov9的onnx模型
  • [iOS]让Xcode 4.2生成的app支持老的iOS设备(armv6)