使用缓冲流(处理流)为什么速度会加快?

本文解释了在处理流数据时设置缓冲的原因及其带来的效率提升。通过比较使用缓冲与不使用缓冲的情况,说明缓冲如何提高数据传输速度,减少CPU负担,实现更高效的文件读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一开始学习处理流会疑问为什么速度会加快呢?好比一个10KB的文件。使用最基本的字节流读写,只要读一次10KB到内存。存一次10KB到目标文件就行了。但是使用缓冲不是要读1次10KB到缓冲,再从缓冲写一次10KB到CPU,再从CPU写10KB到缓冲,再从缓冲10KB到目标文件吗?明显过程长的!

其实不然!如下:

首先为什么要设置缓冲?

如果不设置缓冲的话,CPU取一个存一个。设置缓冲区的话:就好比是把基础流用DMA方式包装起来如下:

CPU通常会使用 DMA 方式去执行 I\O流 操作。CPU 将这个工作交给DMA控制器来做,自己腾出时间做其他的事,当DMA完成工作时,DMA会主动告诉CPU“操作完成”。这时,CPU接管后续工作。在此,CPU 是被动的。DMA是专门 做 I\O 与 内存 数据交换的,不仅自身效率高,也节约了CPU时间,CPU在DMA开始和结束时做了一些设置罢了。 缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,显然效率比较高。还节省CPU的使用。

总结:使用缓冲处理流包装就是一堆一堆的干活,还能不用CPU多次处理数据转换,只是设置一下数据转换成功后的文件。

     不使用缓冲处理流包装就是CPU傻傻的一个字节一个字节循环来干活存储写入文件中,相比可见效率明显变慢。

### Java 中基于字节缓冲流的高级流类型 在 Java 的 I/O 流体系结构中,所有的其他流类型都是建立在字节流之上的[^1]。为了提高读写效率,引入了带缓冲功能的字节流——`BufferedInputStream` 和 `BufferedOutputStream`。 #### 字符流与转换流 虽然字符流不是直接基于字节流构建,但在处理文本数据时非常重要。通过使用 `InputStreamReader` 或者 `OutputStreamWriter` 可以实现从字节到字符以及反向的转换操作。这些类内部维护了一个默认大小的缓存区来优化性能[^2]。 #### 对象序列化流 对象输入输出流 (`ObjectInputStream`, `ObjectOutputStream`) 是一种特殊的过滤器流,允许程序将整个对象图保存至文件或者网络连接并从中恢复出来。这类流同样依赖底层的基础字节流来进行实际的数据传输工作。 #### 压缩/解压缩流 对于需要减少存储空间或加快传输速度的应用场景来说,可以采用 GZIP 输入输出流(`GZIPOutputStream`, `GZIPInputStream`) 来创建符合 gzip 格式的压缩包;而 ZIP 文件则可以通过 Zip 输出入流(`ZipOutputStream`, `ZipInputStream`) 处理。它们都继承自 FilterOutputStream 和 FilterInputStream 类,并且最终还是作用于某个具体的字节流之上。 ```java // 创建带有缓冲机制的对象输出流实例 try (var out = new ObjectOutputStream(new BufferedOutputStream( Files.newOutputStream(Paths.get("data.ser"))))) { // 序列化对象... } catch (IOException e) { System.err.println(e); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值