stringwriter 比 string 或 stringbuilder 更合适,因其既实现 writer 接口可无缝接入 io 体系,又基于 stringbuilder 提供高效内存拼接;string 拼接性能差,stringbuilder 无法直接用于需 writer 参数的场景。

StringWriter 是 Java IO 中专为内存中字符串拼接设计的字符输出流,它内部基于 StringBuilder(JDK 1.5+)或 StringBuffer(旧版本),无需频繁创建新字符串对象,避免了 String += 的性能问题,适合构建动态文本、日志缓冲、模板渲染等场景。
为什么 StringWriter 比直接用 String 或 StringBuilder 更合适?
它实现了 Writer 接口,能无缝接入标准 IO 流体系(如配合 PrintWriter、XMLStreamWriter 或框架中的 Writer 参数),同时保留内存操作的高效性。而纯用 StringBuilder 无法直接作为 Writer 传入需要写入流的方法;纯用 String 拼接则每次 + 都生成新对象,时间与空间开销大。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
基本用法:创建、写入、获取结果
- 创建:直接实例化
new StringWriter(),可选指定初始容量(减少扩容次数) - 写入:调用
write(int c)、write(String str)、write(char[] cbuf, int off, int len)等方法,也可包装成PrintWriter使用println()等便捷方法 - 获取结果:调用
toString()得到最终字符串;注意该方法返回副本,后续写入不影响已获取的字符串
配合 PrintWriter 提升可读性与功能
对需要格式化输出(如换行、自动 flush、类型转换)的场景,推荐包装为 PrintWriter:
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println("Hello");
pw.printf("Value: %d", 42);
pw.close(); // 可选,不 close 也不影响 toString()
String result = sw.toString(); // "Hello\nValue: 42"
注意:PrintWriter 默认不自动 flush,若依赖实时内容,需手动调用 pw.flush();关闭 pw 不会关闭底层 StringWriter,但建议显式 close 以符合资源管理习惯。
注意事项与优化建议
- 线程不安全:
StringWriter本身无同步机制,多线程写入需外部加锁或使用独立实例 - 无需 close:虽然实现了
Closeable,但close()方法为空操作,调用与否不影响功能,但为代码一致性可保留 - 避免重复 toString():内部缓存未更新,多次调用返回相同结果;如需增量内容,应在写入后再次调用
- 容量预估:若知道大致长度,构造时传入容量(如
new StringWriter(1024)),减少内部StringBuilder扩容开销
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










