StringWriter 是 Java 中基于 StringBuilder 的内存字符输出流,用于收集字符串内容;创建后可直接写入或包装为 PrintWriter,调用 toString() 获取结果,线程不安全且无需 flush 或 close。

StringWriter 是 Java 中一个轻量级的字符输出流,它把写入的数据直接保存在内部的 StringBuilder(或旧版本中的 StringBuffer)中,适合用于“收集”字符串内容,尤其在需要将多个输出操作汇总为一个字符串时非常方便。
用 StringWriter 收集字符串的基本流程
核心思路是:创建 StringWriter → 用它作为目标输出流(比如传给 PrintWriter、XML 序列化器、模板引擎等)→ 调用 toString() 获取最终字符串。
- 构造一个
StringWriter实例,无需指定路径或资源,它纯内存操作 - 把它当作普通
Writer使用:可直接写入字符、字符串,也可包装成PrintWriter来支持println、printf等便捷方法 - 调用
stringWriter.toString()得到完整内容;注意不要调用getBuffer().toString()(虽然结果一样),因为toString()是标准且安全的公开 API
常见使用场景示例
1. 捕获日志或调试输出
当某个方法只接受 Writer 参数但你想拿到结果字符串时:
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println("用户登录成功");
pw.printf("时间:%s", LocalDateTime.now());
pw.close();
String output = sw.toString(); // "用户登录成功\n时间:2024-06-15T10:30:45.123\n"
2. 替代字符串拼接,提升可读性
比反复用 += 或 StringBuilder.append() 更符合“流式输出”逻辑,尤其配合模板化逻辑:
StringWriter sw = new StringWriter();
sw.write("订单号:");
sw.write(orderId);
sw.write(",金额:¥");
sw.write(String.valueOf(amount));
String result = sw.toString();
注意事项和最佳实践
StringWriter 是线程不安全的,多线程共用同一个实例会导致内容错乱,应确保单线程使用或每次新建实例。
- 不需要手动
flush()—— 它的write()和close()都不会抛 I/O 异常,close()也无实际作用(可省略) - 如果后续要重复使用,建议新建实例,而不是调用
getBuffer().setLength(0)清空 —— 这样更清晰、不易出错 - 和
StringBuilder相比,StringWriter 提供了标准Writer接口,能无缝对接现有 API(如ObjectMapper.writeValue(writer, obj))
和 StringBuilder 的选择建议
如果只是拼字符串,用 StringBuilder 更直接高效;如果代码已依赖 Writer 接口(如序列化、日志框架、模板渲染),StringWriter 就是自然、低侵入的收集方式。
它不涉及文件、网络或编码转换,纯粹做内存字符串累积,简单可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











