bufferedinputstream 通过内存缓冲、批量读取和预读机制提升i/o性能:默认8kb缓冲区减少系统调用,利用内存与磁盘速度差(百万倍),按块对齐读取契合硬件特性,并基于空间局部性预加载数据。
因为 bufferedinputstream 把“频繁跑硬盘”变成了“少跑多拿”,核心是用内存换时间、用批量换零碎。
减少系统调用次数
FileInputStream 每次调用 read(),都会触发一次操作系统级别的 I/O 调用——从用户态切到内核态,再访问磁盘。这个切换本身就有开销,而机械硬盘的单次寻址+旋转延迟就要几毫秒。BufferedInputStream 内部默认维护一个 8192 字节的缓冲区:第一次 read() 时,它一口气从磁盘读满整个缓冲区;后续 8192 次单字节 read() 全部直接从内存取,不再碰磁盘、不触发系统调用。
利用内存和磁盘的速度鸿沟
内存访问是纳秒级(ns),磁盘是毫秒级(ms)——快约 100 万倍。BufferedInputStream 把数据提前搬进“快车道”(内存缓冲区),让 CPU 始终在高速路上跑,而不是反复堵在慢速收费站(磁盘 I/O)。
契合硬件物理特性
磁盘实际读写以“块”为单位(常见 4KB)。即使你只读 1 字节,磁盘也得把整个块拉进来。FileInputStream 若连续读 100 个字节,可能触发 100 次块读取(甚至重复读同一块);BufferedInputStream 一次性按块对齐读 8KB,既避免重复加载,又减少磁头移动和旋转等待,显著压缩真实 I/O 时间。
预读与空间局部性优化
程序往往顺序访问相邻数据(空间局部性)。BufferedInputStream 在填满缓冲区时,会主动多读一点后续内容——相当于“未雨绸缪”。当你的代码紧接着读下一段字节,数据已在内存中就位,无需等待磁盘响应。
不复杂但容易忽略:缓冲不是魔法,它靠的是批量、预取、内存中转这三招,把原本 100 次低效操作压成 1–2 次高效操作。速度翻 5–10 倍,本质是把“高频小动作”变成了“低频大动作”。











