Java 11 引入 Reader.nullReader() 返回线程安全、不可变的空 Reader 单例,read() 始终返回 -1,markSupported() 返回 false,适用于单元测试、配置禁用等场景。

Java 11 引入了 Reader.nullReader(),它直接返回一个不读取任何字符、始终返回 -1 的空 Reader 实例,无需手动实现或依赖第三方库。
直接使用 Reader.nullReader()(推荐)
这是最简洁、标准的方式,适用于所有 Java 11 及更高版本:
- 调用
Reader.nullReader()即可获得一个线程安全、不可变的空读取器 - 每次调用
read()或read(char[])都立即返回-1(表示流末尾) - 支持
mark()/reset(),但实际行为与InputStream.nullInputStream()类似:markSupported()返回false
兼容 Java 8–10 的替代写法(如需降级支持)
若项目仍需在 Java 10 或更早版本运行,可手动创建等效实现:
- 继承
Reader并重写read()和read(char[])方法,统一返回-1 - 注意必须重写
close()(可为空实现),否则默认抛出IOException - 示例:
new Reader() { public int read() { return -1; } public int read(char[] cbuf) { return -1; } public void close() {} }
常见使用场景
空读取器适合以下情况:
立即学习“Java免费学习笔记(深入)”;
- 单元测试中模拟“无输入”的
Reader参数,避免构造真实数据 - 配置驱动逻辑中,当某选项禁用时,提供默认空流而非
null,防止 NPE - API 封装层统一处理可选输入,保持调用方代码简洁
注意事项
使用时需留意几点:
-
Reader.nullReader()返回的是单例实例,多次调用返回同一对象,轻量且高效 - 它不支持标记/重置(
markSupported()返回false),也不支持跳过(skip()始终返回 0) - 不要对它调用
readLine()(来自BufferedReader),因为该方法依赖底层read()行为,会立即返回null


















