1. 核心目标:读取原始字节 (Raw Bytes)

InputStream 是所有字节输入流的抽象基类。它的核心使命非常纯粹和底层:从数据源(文件、网络连接、内存数组等)中,一次一个地读取原始的字节数据。

2. 关键组件与职责

我们以最常用、最基础的 FileInputStream 为例来展开。

3. 效率的瓶颈:为何不应直接使用 FileInputStream

直接调用 fileInputStream.read() 从文件中一个字节一个字节地读取,效率 极其低下

原因:每一次 read() 调用,都会触发一次从Java程序(用户态)到操作系统内核(内核态)的切换,这被称为 “系统调用(System Call)”。系统调用涉及上下文切换,有相当大的性能开销。想象一下,为了读取1MB的文件,你需要进行超过一百万次这样昂贵的系统调用!

4. 性能的飞跃:BufferedInputStream 的缓冲原理

为了解决上述瓶颈,Java I/O 采用了经典的设计模式——装饰器模式(Decorator Pattern)BufferedInputStream 就是为此而生的。

结构BufferedInputStream 包装(“装饰”)了另一个 InputStream(如 FileInputStream)。

// 推荐的用法
InputStream in = new BufferedInputStream(new FileInputStream("file.txt"));

工作流程(核心!)

  1. [创建与初始化]
  2. [第一次调用 read()]
  3. [后续调用 read()]