在Servlet中,我在StringBuilder中构建了大量的HTML内容,最后需要将其写入响应的PrintWriter。为了使用PrintWriter,它必须首先调用StringBuilder的toString()方法以将内容作为String来获取。但这不必要地重复了内容。有没有办法直接从StringBuilder写入,因为它已经存在内容?
PrintWriter可以接受CharSequence,但文档声明它调用CharSequence的toString(),所以它并没有真正帮助。
我能看到的唯一明确的方法是使用StringBuilder的charAt(i)方法一次获取和写入一个字符,但这会有所改进吗?
答案 0 :(得分:7)
作为替代方案,您可以删除StringBuilder并使用StringWriter和PrintWriter。
答案 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数组),你可以在其中存储汇编的文本......