装饰器模式在 IO 中的应用:分析 BufferedInputStream 如何通过缓冲区提升原始流的读写变量效率

夏敏同学_7720

夏敏同学_7720

2026-06-01

725人浏览

原创

BufferedInputStream是典型的装饰器模式实现,它不改变原始InputStream接口,而是包装已有流(如FileInputStream)并透明添加缓冲能力,支持mark/reset、减少I/O调用次数,并可与其他装饰器叠加。

装饰器模式在 io 中的应用:分析 bufferedinputstream 如何通过缓冲区提升原始流的读写变量效率

BufferedInputStream 是典型的装饰器模式实现

它不改变原始 InputStream 的行为接口,而是把一个已有的输入流(比如 FileInputStream 或 ByteArrayInputStream)包装起来,在其外部增加缓冲能力。整个过程对调用方透明:你依然调用 read()、mark()、reset() 这些方法,但内部执行逻辑已经不同——数据不再每次直接来自磁盘或网络,而是优先从内存缓冲区取。

缓冲区如何减少底层 I/O 调用次数

没有缓冲时,每调用一次 read(),就触发一次系统调用去读一个字节,开销极大。BufferedInputStream 改变了这个节奏:

  • 首次 read() 会触发 fill() 方法,一次性从底层流读取默认 8192 字节(或自定义大小)到内部字节数组
  • 后续多次 read() 都从该数组中按位置取出字节,完全避开系统调用
  • 当数组读完(pos 达到末尾),才再次调用 fill() 加载下一批数据

这相当于把“1000 次单字节读”压缩成“约 2 次 8KB 批量读”,I/O 次数下降两个数量级。

缓冲区大小不是越大越好,需匹配使用场景

默认 8KB 是通用折中值,但实际效果取决于你的数据访问模式:

Ainee: AI Notetaker
Ainee: AI Notetaker

一款AI办公效率工具,主要用于Your ultimate AI-powered notetaking and learning companion.,适合需要提升相关任务效率的用户。

下载
  • 读取超大文件且顺序扫描:可设为 64KB 或 128KB,进一步摊薄 fill() 调用频率
  • 内存受限环境(如嵌入式):可降到 1KB~4KB,避免浪费
  • 随机读 + mark/reset 频繁:过大的缓冲区可能让 markpos 到 pos 距离拉太远,reset 时需重读更多数据

关键不是盲目调大,而是观察真实 I/O 统计(如 Linux 的 iostat)和应用吞吐量变化。

装饰器带来的额外能力不只是提速

BufferedInputStream 在增强性能的同时,还补全了原始流缺失的语义支持:

  • 支持 mark()/reset():原始 FileInputStream 默认不支持标记重读,BufferedInputStream 自己维护 markpos 和 pos 偏移,实现“回退”能力
  • 统一异常处理边界:所有异常仍沿原始流抛出,但缓冲层可做预判(如提前发现 EOF)
  • 可叠加其他装饰器:比如再套一层 DataInputStream 读基本类型,结构清晰、职责分明

这种能力扩展不侵入原始流代码,正体现了装饰器“动态附加职责”的本质。

相关专题

更多
点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.24

974

4

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

2026.11.12

100

15

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

2026.11.12

60

15

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

2026.11.12

60

15

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

160

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

120

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

120

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

100

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

80

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 16.8万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 12.1万人学习

帝国CMS企业仿站教程
帝国CMS企业仿站教程

共17课时 | 2.3万人学习