filterinputstream 是装饰者模式的抽象基类,通过包装 inputstream 并委托方法调用实现功能增强;其子类如 bufferedinputstream、datainputstream 等分别提供缓冲、类型读取等扩展能力。

FilterInputStream 是 Java I/O 中装饰者模式的典型实现,它本身不直接处理数据,而是包装一个已有的 InputStream,通过继承方式增强或修改其行为。
FilterInputStream 的核心作用
它作为抽象基类,提供对底层流的统一访问入口,并预定义了 read()、available()、skip()、close() 等方法的默认委托逻辑。子类只需重写关键方法(如 read()),就能在不改变原始流的前提下添加新功能。
常见子类及扩展场景
Java 标准库中多个实用类继承自 FilterInputStream,每种都解决一类具体需求:
- BufferedInputStream:为流添加缓冲,减少系统调用次数,提升读取效率;
- DataInputStream:支持按基本类型(int、double、boolean 等)读取,适合解析二进制协议;
- PushbackInputStream:允许将已读字节“推回”流中,便于实现简单词法分析或回溯解析;
- LineNumberInputStream(已过时):曾用于跟踪行号,现推荐用 BufferedReader + LineNumberReader 替代。
自定义 FilterInputStream 的步骤
若需实现特定逻辑(如日志记录、数据解密、限速读取),可继承 FilterInputStream:
- 构造函数中调用 super(in),确保持有被装饰的 InputStream;
- 重写需要增强的方法,例如在 read() 前后插入统计、转换或校验逻辑;
- 注意保持委托语义:所有未重写的方法会自动转发到底层流,避免意外破坏行为;
- 若修改了流状态(如内部缓冲、位置标记),需同步更新对应方法(如 mark()/reset())的逻辑。
装饰链的灵活组合
FilterInputStream 支持多层嵌套,形成装饰链。例如:
new DataInputStream(new BufferedInputStream(new FileInputStream("data.bin")))这表示先缓冲读取,再按数据类型解析——各层职责分明,互不耦合。只要每层正确委托,整个链路就可靠可维护。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











