将StringBuilder写入Writer,而不是toString()

时间:2012-09-24 21:13:54

标签: java servlets stringbuilder printwriter

在Servlet中,我在StringBuilder中构建了大量的HTML内容,最后需要将其写入响应的PrintWriter。为了使用PrintWriter,它必须首先调用StringBuilder的toString()方法以将内容作为String来获取。但这不必要地重复了内容。有没有办法直接从StringBuilder写入,因为它已经存在内容?

PrintWriter可以接受CharSequence,但文档声明它调用CharSequence的toString(),所以它并没有真正帮助。

我能看到的唯一明确的方法是使用StringBuilder的charAt(i)方法一次获取和写入一个字符,但这会有所改进吗?

3 个答案:

答案 0 :(得分:7)

作为替代方案,您可以删除StringBuilder并使用StringWriterPrintWriter

答案 1 :(得分:2)

您可以首先写入PrintWriter而不是写入StringBuilder ......

使用charAt绝对不会对您有所帮助。这样做会产生很差的性能。 如果确实希望继续朝这个方向前进,那么可以使用StringBuilder.subString(start,end)方法。此方法允许您一次读取1000个字符并将其打印到PrintWriter ...

答案 2 :(得分:2)

StringBuilder类将字符串存储在内部char数组中。问题是这个char数组不可访问。

提议的解决方案:

1)您可以创建一个扩展ObjectOutputStream的新类,您可以在其中覆盖writeObjectOverride(Object obj)方法。然后,只需序列化构建HTML文档的StringBuilder实例。 您的被覆盖的writeObjectOverride(Object obj)方法将使用Stringbuilder的内部char数组调用,该数组是序列化过程的一部分,并且瞧:您有对String构建器的内部char数组的引用,它是您的将它写入Servlet的PrintWriter输出... 注意:您的writeObjectOverride()方法将被多次调用,显然您可以忽略那些通过您所需的char数组以外的方法。

2)您可以使用CharBuffer类而不是StringBuilder,其中array()方法返回内部数组。 CharBuffer没有与StringBuilder一样多的追加(或放置)操作,因此需要稍微扩展一下(具体取决于您的需要)......

3)您可以编写自己的StringBuilder实现,或者更确切地说是从中使用它。这样你就可以访问对象(例如一个char数组),你可以在其中存储汇编的文本......