2012-09-24 39 views
6

olmadan bir Yazara StringBuilder yazın Bir Servlet'te, bir StringBuilder içinde çok fazla miktarda HTML içeriği yapıyorum, sonunda yanıt yazıcının PrintWriter'e yazılması gerekir. Bir PrintWriter kullanmak için, içeriği String olarak almak için önce StringBuilder'ın toString() yöntemini çağırması gerekir. Ancak bu, gereksiz yere içeriği çoğaltır. İçeriği tuttuğu için doğrudan StringBuilder'dan yazmanın bir yolu var mı?toString()

PrintWriter bir CharSequence'ı kabul edebilir, ancak belgelere göre CharSequence'ın toString() işlevini çağırır, bu yüzden gerçekten yardımcı olmaz.

Görebildiğim tek açık yolu, bir defada bir karakter almak ve yazmak için StringBuilder'ın charAt (i) yöntemini kullanmaktır, ancak bu bir gelişme olur mu?

+2

İyileştirme görecelidir. Amacınız hafıza tüketimini azaltmaksa, o zaman evet bir iyileştirme olacaktır. Daha yavaş olup olmadığını test etmelisin. Çıktı akışının tamponlanmasından dolayı performans cezasının o kadar da büyük olmaması beni şaşırtmayacaktı. –

cevap

7

Alternatif olarak, StringBuilder'ı bırakabilir ve StringWriter ve PrintWriter kullanabilirsiniz.

+0

HTML içeriğini almam ve HttpServletResponse'nin getWriter() yöntemini çağırarak elde edilen Servlet'in PrintWriter dosyasına yazmam gerekiyor. Bunu bir StringWriter ile birleştirmenin bir yolunu görmüyorum. – worpet

2

sadece ilk etapta yerine StringBuilder için PrintWriter yazabilirsiniz ...

kesinlikle yardımcı olmaz charAt kullanma. Bu şekilde yapmak için çok zayıf bir performans verecektir.Eğer gerçektenStringBuilder.subString(start,end) yöntemini kullanarak bu yönde devam etmek istiyorsanız. Bu yöntem, örneğin bir seferde 1000 karakter okumalı ve bunu PrintWriter'e yazdıracaktır ...

+0

'StringBuilder.substring()' her arama yaptığınızda yeni bir String atar. Tahsis edilen toplam bellek miktarı daha küçük olmasına rağmen, eşik çok fazla yük getirmektedir. Aslında charAt() 'ın kullanılmasının o kadar da kötü olmayacağını düşünürdüm çünkü büyük olasılıkla Servlet'in PrintWriter'i arabelleğe alınır. –

2

StringBuilder sınıfı, dizeyi dahili bir char dizisinde saklar. Sorun şu ki bu char dizisi erişilebilir değil.

Önerilen çözümler:

1) Eğer writeObjectOverride(Object obj) yöntemini geçersiz ObjectOutputStream, uzayan yeni bir sınıf oluşturabilir. Ardından, HTML belgenizi oluşturduğunuz StringBuilder örneğini basitleştirin. Geçersiz kılma writeObjectOverride(Object obj) yönteminiz, serileştirme işleminin bir parçası olan Stringbuilder iç char dizisi ile çağrılacaktır ve voila: String oluşturucusunun iç char dizilimine başvurunuz var, siz onu Servlet PrintWriter'e yazmanız yeterli ... Not: sizin writeObjectOverride() yönteminiz birden çok kez çağrılacak, belli ki size istenen char dizisinden başka bir şey iletenleri göz ardı edebilirsiniz.

2) İç diziyi döndüren array() yöntemine sahip StringBuilder yerine CharBuffer sınıfını kullanabilirsiniz. CharBuffer Sen kendi uygulama yazabilirsiniz

3) ... gibi birçok append (veya koymak) StringBuilder gibi işlemler, bu nedenle biraz (tam olarak ne gerek bağlı olarak) o uzatmak için gerektirecektir gelmez StringBuilder, ya da bundan ne kullanıyorsunuz. Bu şekilde, nesneye (örneğin, bir char dizisi) erişebileceğiniz birleştirilmiş metinleri saklamanız mümkün olacaktır ...

+0

Çözüm 1'in çalışacağından emin değilim, çünkü writeObjectOverride kullanmak için bir mantıksal mantık mantığını yeniden yazmanız gerekiyor çünkü ObjectOutputStream yapıcısı bir parametre writeObjectOverride çağrısını devre dışı bırakır. yani, bu şekilde kullanılmak üzere tasarlanmamıştır. Ayrıca normal durumu ele almak için writeObjectOverride içinde arayabileceğiniz başka bir yöntem yoktur. Ancak refleksi kullanabilirsiniz ancak güvenlik yöneticisi yolunuza çıkabilir. – cquezel