6

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

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

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

4

3 回答 3

7

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

于 2012-09-24T21:20:10.400 回答
2

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

使用charAt绝对不会帮助你。这样做会产生非常糟糕的性能。如果您真的想朝那个方向前进,您可以使用该StringBuilder.subString(start,end)方法。此方法将允许您一次读取例如 1000 个字符并将其打印到 PrintWriter...

于 2012-09-24T21:20:13.253 回答
2

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

建议的解决方案:

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

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

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

于 2012-09-28T13:08:59.133 回答