6

サーブレットでは、最後に応答の PrintWriter に書き込む必要がある非常に大量の HTML コンテンツを StringBuilder に作成しています。PrintWriter を使用するには、最初に StringBuilder の toString() メソッドを呼び出してコンテンツを文字列として取得する必要があります。しかし、これはコンテンツを不必要に複製します。すでにコンテンツを保持しているため、StringBuilder から直接書き込む方法はありますか?

PrintWriter は CharSequence を受け入れることができますが、ドキュメントには CharSequence の toString() を呼び出すと記載されているため、実際には役に立ちません。

私が見ることができる唯一の明確な方法は、StringBuilder の charAt(i) メソッドを使用して、一度に 1 文字を取得して書き込むことですが、これは改善されますか?

4

3 に答える 3

7

別の方法として、 StringBuilder を削除して、StringWriterPrintWriterを使用することもできます。

于 2012-09-24T21:20:10.400 に答える
2

このStringBuilderクラスは、文字列を内部の char 配列に格納します。問題は、この char 配列にアクセスできないことです。

提案された解決策:

ObjectOutputStream1)メソッドをオーバーライドする新しいクラスを拡張して作成できますwriteObjectOverride(Object obj)。次にStringBuilder、HTML ドキュメントを作成したインスタンスを単純にシリアル化します。オーバーライドさwriteObjectOverride(Object obj)れたメソッドはStringbuilder、シリアル化プロセスの一部であるの内部 char 配列で呼び出されます。出来上がり: String ビルダーの内部 char 配列への参照があり、それをサーブレットの PrintWriter 出力に書き込むのはあなたです..注:メソッドは複数回呼び出されますwriteObjectOverride()が、目的の char 配列以外のものを渡すメソッドは無視できます。

2)内部配列を返すメソッドを持つCharBuffer代わりに、クラスを使用できます。には、 ほど多くの追加 (または配置) 操作がないため、それらを少し拡張する必要があります (正確に何が必要かによって異なります)...StringBuilderarray()CharBufferStringBuilder

3) の独自の実装StringBuilder、またはそれから使用するものを作成できます。そうすれば、組み立てられたテキストを保存するオブジェクト(たとえば、char配列)にアクセスできます...

于 2012-09-28T13:08:59.133 に答える
2

StringBuilderではなく、最初にPrintWriterに書き込むことができます...

を使用してcharAtも、間違いなく役に立ちません。この方法で行うと、パフォーマンスが非常に低下します。本当にその方向に進みたい場合は、メソッドを使用できStringBuilder.subString(start,end)ます。このメソッドを使用すると、たとえば一度に 1000 文字を読み取り、それを PrintWriter に出力できます...

于 2012-09-24T21:20:13.253 に答える