java 11+ 中没有 writer.nullwriter(),它是 apache commons io 提供的;jdk 原生可用 outputstream.nulloutputstream() 配合 outputstreamwriter 构造空 writer,或通过匿名子类实现,二者均线程安全、无副作用。

Java 11+ 中没有 Writer.nullWriter() 这个静态方法 —— 它是 Apache Commons IO 库(org.apache.commons.io.output.NullWriter)提供的,并非 JDK 原生 API。
Java 原生替代方案:使用 java.io.Writer 的匿名子类
标准 JDK 不提供“空 Writer”的工厂方法,但可以轻松创建一个真正丢弃所有写入内容的 Writer 实例:
- 重写
write(char[] cbuf, int off, int len)、write(String str, int off, int len)和flush()方法,使其不执行任何操作; -
close()也无需处理(空实现即可); - 为避免意外 NPE 或未定义行为,建议同时覆盖单字符
write(int c)方法。
示例代码:
Writer nullWriter = new Writer() {
@Override
public void write(char[] cbuf, int off, int len) {
// 忽略所有字符
}
@Override
public void write(String str, int off, int len) {
// 忽略所有字符串片段
}
@Override
public void write(int c) {
// 忽略单个字符
}
@Override
public void flush() {
// 无需刷新
}
@Override
public void close() {
// 无需关闭
}
};
更简洁:用 java.io.OutputStreamWriter 包装 java.io.OutputStream.nullOutputStream()
Java 9 引入了 OutputStream.nullOutputStream(),它是 JDK 原生的、高效且线程安全的空输出流。你可以用它构造一个真正的空 Writer:
- 指定合适的字符集(如
StandardCharsets.UTF_8),确保编码逻辑被跳过但不会抛异常; - 该方式复用了 JDK 已优化的空流实现,语义清晰、无副作用。
示例:
import java.nio.charset.StandardCharsets;
import java.io.*;
Writer nullWriter = new OutputStreamWriter(
OutputStream.nullOutputStream(),
StandardCharsets.UTF_8
);
注意点与常见误区
-
不要用
new StringWriter()并忽略结果:它会累积内容到内存,不是“空”,而是“隐形收集”; -
避免继承
Writer后遗漏关键方法:尤其write(int)和flush(),否则可能触发默认异常或阻塞; - 若需线程安全:上述两种方式本身无状态,天然线程安全;
-
日志/测试场景推荐封装成工具方法,例如:
public static Writer nullWriter() { return new OutputStreamWriter(OutputStream.nullOutputStream(), UTF_8); }。
不复杂但容易忽略:JDK 原生已有足够支持,无需引入第三方库就能获得语义明确、性能可靠的空 Writer。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











