2012-09-24 27 views
6

在Servlet中,我建立在一個StringBuilder的是,到了最後,需要被寫入到響應的PrintWriter的一個非常大的HTML內容。爲了使用PrintWriter,它必須首先調用StringBuilder的toString()方法以String形式獲取內容。但是這會不必要地重複內容。有什麼方法可以直接從StringBuilder寫入,因爲它已經持有內容了?寫一個StringBuilder一個作家,沒有的toString()

的PrintWriter可以接受的CharSequence,但文檔指出它調用的CharSequence的toString(),所以它並沒有真正的幫助。

唯一明確的方式,我可以看到的是使用StringBuilder的的charAt(I)方法來獲得,並且一次寫一個字,但是這會是一個進步?

+2

改進是相對的。如果你的目標是減少內存消耗,那麼是的,這將是一個改進。你應該測試它是否更慢。如果 - 由於輸出流的緩衝,我不會感到驚訝 - 性能損失畢竟不是那麼大。 –

回答

7

作爲替代方案,你可以刪除的StringBuilder和使用StringWriterPrintWriter

+0

我需要將HTML內容寫入Servlet的PrintWriter,它通過調用HttpServletResponse的getWriter()方法獲得。我沒有看到將這與StringWriter結合的方法。 – worpet

2

你可以只寫的PrintWriter擺在首位,而不是到StringBuilder ...

使用charAt絕對不會幫你。這樣做會產生很差的性能。 如果你真的朝着這個方向前進,你可以使用StringBuilder.subString(start,end)方法。此方法將允許您一次讀取1000個字符並將其打印到PrintWriter ...

+0

'StringBuilder.substring()'每次調用它時都會分配一個新的String。儘管分配的內存總量會更小,但它會產生很多開銷。我實際上認爲使用charAt()不會那麼糟糕,因爲大多數情況下Servlet的PrintWriter可能會被緩衝。 –

2

StringBuilder類將字符串存儲在內部char數組中。問題是這個char數組不可訪問。

提出的解決方案:

1)你可以創建擴展ObjectOutputStream,在那裏你重寫writeObjectOverride(Object obj)方法的新類。然後簡單地序列化您構建HTML文檔的StringBuilder實例。 你重寫writeObjectOverride(Object obj)方法與Stringbuilder這是序列化過程的一部分,內部的字符數組被調用,瞧:你有參考字符串生成器的內部字符數組,這是你將它寫入Servlet的PrintWriter的輸出... 注意:你的writeObjectOverride()方法將被多次調用,顯然你可以忽略那些傳遞給你的東西,而不是所需的字符數組。

2)您可以使用CharBuffer類而不是StringBuilder其中array()方法返回內部數組。 CharBuffer沒有儘可能多的追加(或認沽)操作爲StringBuilder,所以它需要延長的一點點(取決於你所需要究竟是什麼)......

3)你可以寫自己的實現的StringBuilder,或者更確切地說你使用它。這樣你就可以訪問存儲組合文本的對象(例如字符數組)......

+0

我不確定解決方案1會工作,因爲要使用writeObjectOverride,您需要重寫大部分序列化邏輯,因爲一個參數ObjectOutputStream構造函數會禁用對writeObjectOverride的調用。即它不是以這種方式使用的。另外,在writeObjectOverride內部沒有其他方法可以處理正常情況。儘管你可以使用反射,但安全管理員可能會阻礙你。 – cquezel

相關問題