StringWriter 是 Java 中基于 StringBuilder 的内存字符输出流,用于高效构建字符串;支持 write() 写入和 toString() 获取结果,常与 PrintWriter/Formatter 配合实现格式化输出,适用于日志捕获、模板渲染等场景。

StringWriter 是 Java 中一个便捷的字符输出流,它内部使用 StringBuilder(或 StringBuffer)作为缓冲区,专门用于将字符数据写入内存中的字符串,而无需操作文件或网络等外部资源。
基本用法:创建、写入、获取结果
只需实例化 StringWriter,调用 write() 方法写入字符或字符串,最后通过 toString() 获取累积的字符串内容:
- 构造时可指定初始容量(非必需),避免频繁扩容
-
write(int c)、write(String str)、write(char[] cbuf, int off, int len)均可用 - 调用
close()并非必须(StringWriter 的 close 不起实际作用),但符合流使用习惯
示例:
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(' ');
writer.write("World");
System.out.println(writer.toString()); // 输出:Hello World
writer.close();
配合 PrintWriter 或 Formatter 使用
StringWriter 常作为底层输出目标,与 PrintWriter 或 Formatter 组合,支持格式化输出:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
PrintWriter pw = new PrintWriter(writer)后可用println()、printf()等方法 -
Formatter f = new Formatter(writer)可进行更精细的格式控制(如数字对齐、精度)
示例:
StringWriter writer = new StringWriter();
PrintWriter pw = new PrintWriter(writer);
pw.printf("Name: %s, Age: %d", "Alice", 30);
pw.close();
System.out.println(writer.toString()); // 输出:Name: Alice, Age: 30
替代方案与注意事项
虽然 StringWriter 简单易用,但需注意其适用场景和潜在替代项:
- 若仅做字符串拼接,直接用
StringBuilder更轻量、语义更清晰 - StringWriter 是线程不安全的;如需多线程写入,应自行同步,或改用
StringBuffer(但 StringWriter 本身不提供线程安全版本) - 它实现了
Appendable接口,因此也可传给接受 Appendable 的方法(如Objects.toString()的某些重载)
常见用途举例
StringWriter 多用于需要“捕获输出”的场景:
- 单元测试中捕获日志或模板渲染结果(如配合 Velocity、FreeMarker 的 Writer 输出)
- 将 XML/JSON 生成器(如 JAXB、Jackson)的输出重定向到字符串
- 临时将异常堆栈写入字符串:
e.printStackTrace(new PrintWriter(writer))

















