缓冲流提升IO效率的核心是减少磁盘访问次数,通过内置缓冲区(默认8KB)实现批量读写,避免频繁系统调用;字节缓冲流适合二进制文件,字符缓冲流专为文本设计并支持按行读写与编码指定。

Java 进阶文件读写中,用缓冲流提升 IO 效率的核心是减少磁盘访问次数——不是靠“多读几次”,而是让每次读写都尽可能从内存拿数据,而不是直连磁盘。
缓冲流为什么快?关键在“批处理”
普通 FileInputStream 每次 read() 都触发一次系统调用;而 BufferedInputStream 内置 8KB 缓冲区,首次 read 会一次性从磁盘加载最多 8KB 到内存,后续多次 read() 全部从内存取,直到缓冲区耗尽才再次触碰磁盘。实测复制 370MB 文件,缓冲流比基础流快 10 倍以上。
- 默认缓冲区大小为 8192 字节(8KB),已适配大多数场景
- 大文件(如视频、日志)可手动设为 32KB 或 64KB:new BufferedInputStream(in, 32 * 1024)
- 缓冲区不是越大越好:超过 1MB 容易挤占堆内存,可能引发 GC 延迟
字节缓冲流:适合所有二进制文件
复制图片、压缩包、音视频等必须用 BufferedInputStream + BufferedOutputStream,它们不关心内容含义,只高效搬运字节。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 必须包装基础流使用,不能独立创建:new BufferedInputStream(new FileInputStream("a.mp4"))
- 推荐配合 try-with-resources 自动释放资源,close() 会自动 flush() 输出缓冲区
- 读写时仍用 byte[] 数组(如 new byte[8192]),但实际操作的是缓冲区,不是磁盘
字符缓冲流:文本处理更省心
BufferedReader 和 BufferedWriter 专为文本设计,自带按行读写能力,避免手动处理换行符和编码问题。
- readLine() 一行一读,自动识别 \n、\r\n、\r,返回 null 表示结束
- newLine() 写入平台无关的换行符(Windows 是 \r\n,Linux 是 \n)
- 底层仍依赖 InputStreamReader/OutputStreamWriter,若需指定编码,应先包装:new BufferedReader(new InputStreamReader(in, "UTF-8"))
别踩这俩坑:常见低效写法
一是用单字节 read() / write() 调用缓冲流——虽然走的是缓冲区,但逻辑上仍是逐字节循环,完全浪费缓冲优势;二是忘记关闭流或漏掉 flush()(尤其输出流未 close 且未显式 flush 时,最后一块缓冲数据可能丢失)。
- 始终用数组批量读写:bis.read(buffer) 而非 bis.read()
- 输出流务必用 try-with-resources 或显式调用 flush() + close()
- 不要嵌套多层缓冲流(如 new BufferedInputStream(new BufferedInputStream(...))),徒增开销
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










