StringWriter 不提供获取内部 StringBuffer 的公共方法,因其缓冲区为私有实现细节且 JDK 版本间类型不一致(JDK 8 用 StringBuffer,JDK 9+ 改用 StringBuilder),强行反射访问破坏封装性、影响可移植性;推荐使用 toString() 获取内容,仅极少数性能场景才需直接操作缓冲区。

Java 中 StringWriter 并不直接提供获取其内部 StringBuffer 对象的公共方法,因为它的内部缓冲区是私有的(JDK 8 及以前用的是 StringBuffer,JDK 9+ 改为 StringBuilder),且 API 设计上不鼓励外部直接访问或修改底层缓冲区。
为什么不能直接获取 StringBuffer?
StringWriter 是 Writer 的子类,封装了字符写入逻辑,内部缓冲区属于实现细节。官方 API 没有暴露该字段,也不保证不同 JDK 版本使用相同类型(例如 JDK 9+ 使用 StringBuilder 替代 StringBuffer),因此强行反射获取不仅不安全,还破坏封装性、影响可移植性。
推荐做法:用 toString() 获取内容
绝大多数场景下,你真正需要的是写入的内容,而不是缓冲区对象本身。调用 toString() 即可获得当前全部内容的字符串副本:
StringWriter writer = new StringWriter();writer.write("hello"); writer.write(" world");String result = writer.toString(); // "hello world"
如果确实需要 StringBuffer(极少数情况)
仅当你要复用缓冲区、避免字符串拷贝、或做特殊性能优化时才考虑。此时应绕过 StringWriter,直接使用 StringBuffer 或 StringBuilder,并配合 StringWriter(StringBuffer) 构造器(JDK 8 及以前支持):
立即学习“Java免费学习笔记(深入)”;
StringBuffer buf = new StringBuffer();StringWriter writer = new StringWriter(buf); // JDK 8 允许- 之后可通过
buf直接操作,writer的写入会同步到它 - 注意:JDK 9+ 移除了该构造器,此方式不可移植
不建议的做法:反射获取内部字段
虽然可通过反射读取 StringWriter 的私有字段(如 StringWriter#lock 或缓冲区字段),但字段名、类型、是否存在都随 JDK 版本变化,极易出错且违反设计原则。除非在受控环境下的临时调试,否则应避免。
不复杂但容易忽略:多数时候,toString() 就是你真正需要的答案。


















