Java 11+ 中获取丢弃数据的空输出流应直接使用 OutputStream.nullOutputStream(),该方法返回线程安全、无副作用的空流,所有操作为空实现;Java 8 及以下需自定义或借助第三方库。

Java 11+ 中获取丢弃数据的空输出流,直接使用 OutputStream.nullOutputStream() 即可。
Java 11 引入的静态工厂方法
从 Java 11 开始,java.io.OutputStream 新增了静态方法:
-
OutputStream.nullOutputStream()—— 返回一个不执行任何操作、安全且线程安全的空输出流 - 该流的
write(...)、flush()、close()等所有方法均为空实现,不会抛异常,也不会消耗资源 - 相比手动创建匿名子类或复用旧版
DevNullOutputStream(如 Apache Commons IO),这是标准、零依赖的首选方案
典型使用场景
适用于需要“接收但忽略”字节数据的场合,例如:
- 调用某个必须传
OutputStream的 API,但你只关心处理过程,不关心输出内容 - 单元测试中屏蔽日志或临时输出,避免干扰控制台或文件
- 调试时临时替换真实流,验证逻辑是否正常执行而不产生副作用
示例:
// 不写入任何内容,但满足方法签名要求
try (OutputStream sink = OutputStream.nullOutputStream()) {
someMethodThatWritesToOutputStream(sink);
}
兼容性与替代方案(Java 8 及更早)
如果你的项目仍需支持 Java 8 或更低版本:
- 不能直接调用
nullOutputStream()(编译失败) - 可自行定义一个轻量空流:
new OutputStream() { public void write(int b) {} } - 或引入第三方库如 Apache Commons IO 的
IOUtils.nullOutputStream() - 升级到 Java 11+ 后建议统一改用标准 API
注意事项
这个空流是不可逆的 —— 数据一旦写入即彻底丢失,无法读回或检查;它也不维护内部状态(如计数器),因此不适合用于统计写入字节数等用途。如需统计,应自行包装或使用 CountingOutputStream 类(如来自 Commons IO)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











