核心原因是大幅减少系统调用次数和磁盘等待开销:BufferedInputStream用8KB内存缓冲将百万次逐字节I/O合并为约125次批量读取,利用内存(纳秒级)与磁盘(毫秒级)百万倍速度差,通过批量读、块对齐、预读和减少上下文切换提升性能。

核心原因不是“加了缓冲”,而是大幅减少了系统调用次数和磁盘等待开销。
减少高频系统调用
FileInputStream 的 read() 每次调用都触发一次系统级 I/O:用户态切内核态、寻道、等磁盘响应、数据拷贝……这些开销远高于内存操作。而 BufferedInputStream 内部维护一个默认 8KB 的字节数组,只在缓冲区空时才真正调用底层流的 read(byte[]) 批量填充;后续读取全部从内存拿,纳秒级完成。
- 读 1MB 文件(逐字节):FileInputStream ≈ 100 万次系统调用
- 同场景 + BufferedInputStream(8KB 缓冲):≈ 125 次批量填充 + 百万次内存访问
利用存储层次的速度差
机械硬盘访问延迟是毫秒级(ms),内存是纳秒级(ns)——速度相差约 10⁶ 倍。BufferedInputStream 把原本频繁访问慢速设备的操作,转为大部分时间访问高速内存,本质是用空间换时间。
- 每次磁盘读取至少一个物理块(如 4KB),即使只要 1 字节,也得读整块
- 缓冲区按块对齐读取,避免重复加载同一磁盘块
- 顺序读时预加载相邻数据,发挥空间局部性优势
降低磁盘与上下文切换开销
机械硬盘有明显寻址时间(磁头移动 + 旋转延迟),每次小读都可能引发新寻道。BufferedInputStream 通过批量读取连续扇区,显著减少磁头移动次数。同时,系统调用伴随的上下文切换(寄存器保存/恢复)虽单次微小,但百万次累积影响显著——缓冲机制直接压低了切换频次。
立即学习“Java免费学习笔记(深入)”;
适用场景有明确边界
缓冲提速只在特定读取方式下生效:
- ✅ 明显受益:while ((b = bis.read()) != -1)、BufferedReader.readLine()、解析协议头、逐行读日志
- ❌ 效果微弱甚至拖慢:已用 fis.read(buf, 0, 8192) 批量读、读取小于 4KB 的小文件、单次 read() 就结束
- ⚠️ 网络流例外:即使批量读,因 TCP 往返延迟高(10~50ms),缓冲仍常有收益


















