# StringBuilder effektiv auf OutputStream schreiben



## Wladimir (4. Mrz 2010)

Hallo,
vielleicht kennt jemand eine gute Lösung, es geht um Speichereffizienz und Performance.

Ich erstelle im Speicher ein XML mit StringBuilder und will dieses nachhen per OutputStream streamen (Netzwerk TCP/IP oder Datei).
Das XML kann bis 100 MB groß werden. Das Problem ist:

```
outputStreamWriter.write(stringBuilder.toString());
```
kopiert den ganzen String im Speicher. .getChars() kopiert auch. Das ganze summierte sich zeitmäßig beim Kopieren.

Ich suche eine Lösung um von einem "dynamischen Array" (StringBuilder, ...) direkt zu stream ohne dazwischen die Inhalte im Speicher nochmals zu kopieren.


----------



## SlaterB (4. Mrz 2010)

das char[] darin ist nicht öffentlich, da kommst du höchstens unsauber über Reflection ran,
oder mit charAt() einzeln abfragen, 

du könntest noch den Quellcode komplett kopieren..


----------



## Wladimir (4. Mrz 2010)

Verwende jetzt 
	
	
	
	





```
CharArrayWriter.writeTo (OutputStream out)
```
 scheint ganz gut zu funktionieren. Verbraucht tatsächlich weniger speicher ohne zu kopieren. Ist aber komischerweise etwas langsamer als StringBuilder.

Mein Test mit JDK 1.5_07 war:
Für das erstellen und schreiben eines 80MB Strings in eine Datei:

StringBuffer .. 7,4 sec
StringBuilder.. 3,9 sec
CharArrayWriter .. 6,6 sec
ByteArrayOutputStream 11,2 sec

Die letzten beiden verbrauchten weniger speicher.

Habe vorher auch die Lösung mit Reflection probiert, würde ja auch gut klingen, doch leider stelle es das Programm auf einer IBM VM auf.


----------



## Wildcard (4. Mrz 2010)

Du könntest wesentlich mehr gewinnen wenn du eine Datei dieser Größe per NIO schreibst.


----------

